Rename ThresholdKeys::secret_share to ThresholdKeys::original_secret_share

This commit is contained in:
Luke Parker
2025-08-18 05:26:41 -04:00
parent 7c8f13ab28
commit 104c0d4492
10 changed files with 53 additions and 40 deletions

40
Cargo.lock generated
View File

@@ -1068,7 +1068,7 @@ dependencies = [
"bitcoin", "bitcoin",
"hex", "hex",
"k256", "k256",
"modular-frost 0.10.0", "modular-frost 0.10.1",
"rand_core", "rand_core",
"secp256k1", "secp256k1",
"serde", "serde",
@@ -2247,7 +2247,7 @@ dependencies = [
[[package]] [[package]]
name = "dkg" name = "dkg"
version = "0.6.0" version = "0.6.1"
dependencies = [ dependencies = [
"borsh", "borsh",
"ciphersuite 0.4.1", "ciphersuite 0.4.1",
@@ -2261,7 +2261,7 @@ name = "dkg-dealer"
version = "0.6.0" version = "0.6.0"
dependencies = [ dependencies = [
"ciphersuite 0.4.1", "ciphersuite 0.4.1",
"dkg 0.6.0", "dkg 0.6.1",
"rand_core", "rand_core",
"std-shims", "std-shims",
"zeroize", "zeroize",
@@ -2272,7 +2272,7 @@ name = "dkg-musig"
version = "0.6.0" version = "0.6.0"
dependencies = [ dependencies = [
"ciphersuite 0.4.1", "ciphersuite 0.4.1",
"dkg 0.6.0", "dkg 0.6.1",
"dkg-recovery", "dkg-recovery",
"multiexp 0.4.0", "multiexp 0.4.0",
"rand_core", "rand_core",
@@ -2287,7 +2287,7 @@ version = "0.6.0"
dependencies = [ dependencies = [
"chacha20", "chacha20",
"ciphersuite 0.4.1", "ciphersuite 0.4.1",
"dkg 0.6.0", "dkg 0.6.1",
"dleq 0.4.1", "dleq 0.4.1",
"flexible-transcript", "flexible-transcript",
"multiexp 0.4.0", "multiexp 0.4.0",
@@ -2299,10 +2299,10 @@ dependencies = [
[[package]] [[package]]
name = "dkg-promote" name = "dkg-promote"
version = "0.6.0" version = "0.6.1"
dependencies = [ dependencies = [
"ciphersuite 0.4.1", "ciphersuite 0.4.1",
"dkg 0.6.0", "dkg 0.6.1",
"dkg-recovery", "dkg-recovery",
"dleq 0.4.1", "dleq 0.4.1",
"flexible-transcript", "flexible-transcript",
@@ -2316,7 +2316,7 @@ name = "dkg-recovery"
version = "0.6.0" version = "0.6.0"
dependencies = [ dependencies = [
"ciphersuite 0.4.1", "ciphersuite 0.4.1",
"dkg 0.6.0", "dkg 0.6.1",
"thiserror 2.0.14", "thiserror 2.0.14",
"zeroize", "zeroize",
] ]
@@ -2584,7 +2584,7 @@ dependencies = [
"flexible-transcript", "flexible-transcript",
"group", "group",
"k256", "k256",
"modular-frost 0.10.0", "modular-frost 0.10.1",
"rand_core", "rand_core",
"thiserror 1.0.64", "thiserror 1.0.64",
"tokio", "tokio",
@@ -2748,7 +2748,7 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
[[package]] [[package]]
name = "flexible-transcript" name = "flexible-transcript"
version = "0.3.2" version = "0.3.3"
dependencies = [ dependencies = [
"blake2", "blake2",
"digest 0.10.7", "digest 0.10.7",
@@ -2971,7 +2971,7 @@ dependencies = [
"ciphersuite 0.4.1", "ciphersuite 0.4.1",
"flexible-transcript", "flexible-transcript",
"group", "group",
"modular-frost 0.10.0", "modular-frost 0.10.1",
"rand_core", "rand_core",
"schnorr-signatures 0.5.1", "schnorr-signatures 0.5.1",
"schnorrkel", "schnorrkel",
@@ -4953,12 +4953,12 @@ dependencies = [
[[package]] [[package]]
name = "modular-frost" name = "modular-frost"
version = "0.10.0" version = "0.10.1"
dependencies = [ dependencies = [
"ciphersuite 0.4.1", "ciphersuite 0.4.1",
"dalek-ff-group", "dalek-ff-group",
"digest 0.10.7", "digest 0.10.7",
"dkg 0.6.0", "dkg 0.6.1",
"dkg-dealer", "dkg-dealer",
"dkg-recovery", "dkg-recovery",
"flexible-transcript", "flexible-transcript",
@@ -8152,7 +8152,7 @@ dependencies = [
"frame-system", "frame-system",
"frost-schnorrkel", "frost-schnorrkel",
"hex", "hex",
"modular-frost 0.10.0", "modular-frost 0.10.1",
"monero-wallet", "monero-wallet",
"multiaddr", "multiaddr",
"parity-scale-codec", "parity-scale-codec",
@@ -8214,7 +8214,7 @@ dependencies = [
"hex", "hex",
"libp2p", "libp2p",
"log", "log",
"modular-frost 0.10.0", "modular-frost 0.10.1",
"parity-scale-codec", "parity-scale-codec",
"rand_core", "rand_core",
"schnorr-signatures 0.5.1", "schnorr-signatures 0.5.1",
@@ -8239,7 +8239,7 @@ dependencies = [
"blake2", "blake2",
"borsh", "borsh",
"ciphersuite 0.4.1", "ciphersuite 0.4.1",
"dkg 0.6.0", "dkg 0.6.1",
"dockertest", "dockertest",
"hex", "hex",
"parity-scale-codec", "parity-scale-codec",
@@ -8483,7 +8483,7 @@ dependencies = [
"bitcoin-serai", "bitcoin-serai",
"ciphersuite 0.4.1", "ciphersuite 0.4.1",
"dalek-ff-group", "dalek-ff-group",
"dkg 0.6.0", "dkg 0.6.1",
"dkg-dealer", "dkg-dealer",
"dkg-musig", "dkg-musig",
"dkg-recovery", "dkg-recovery",
@@ -8591,7 +8591,7 @@ dependencies = [
"hex", "hex",
"k256", "k256",
"log", "log",
"modular-frost 0.10.0", "modular-frost 0.10.1",
"monero-simple-request-rpc", "monero-simple-request-rpc",
"monero-wallet", "monero-wallet",
"parity-scale-codec", "parity-scale-codec",
@@ -8617,7 +8617,7 @@ name = "serai-processor-messages"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"borsh", "borsh",
"dkg 0.6.0", "dkg 0.6.1",
"parity-scale-codec", "parity-scale-codec",
"serai-coins-primitives", "serai-coins-primitives",
"serai-in-instructions-primitives", "serai-in-instructions-primitives",
@@ -8633,7 +8633,7 @@ dependencies = [
"borsh", "borsh",
"ciphersuite 0.4.1", "ciphersuite 0.4.1",
"curve25519-dalek", "curve25519-dalek",
"dkg 0.6.0", "dkg 0.6.1",
"dockertest", "dockertest",
"ethereum-serai", "ethereum-serai",
"hex", "hex",

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "dkg" name = "dkg"
version = "0.6.0" version = "0.6.1"
description = "Distributed key generation over ff/group" description = "Distributed key generation over ff/group"
license = "MIT" license = "MIT"
repository = "https://github.com/serai-dex/serai/tree/develop/crypto/dkg" repository = "https://github.com/serai-dex/serai/tree/develop/crypto/dkg"

View File

@@ -47,7 +47,7 @@ pub fn test_musig() {
verification_shares.insert( verification_shares.insert(
these_keys.params().i(), these_keys.params().i(),
<Ristretto as Ciphersuite>::generator() * **these_keys.secret_share(), <Ristretto as Ciphersuite>::generator() * **these_keys.original_secret_share(),
); );
assert_eq!(these_keys.group_key(), group_key); assert_eq!(these_keys.group_key(), group_key);

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "dkg-promote" name = "dkg-promote"
version = "0.6.0" version = "0.6.1"
description = "Promotions for keys from the dkg crate" description = "Promotions for keys from the dkg crate"
license = "MIT" license = "MIT"
repository = "https://github.com/serai-dex/serai/tree/develop/crypto/dkg/promote" repository = "https://github.com/serai-dex/serai/tree/develop/crypto/dkg/promote"
@@ -25,7 +25,7 @@ transcript = { package = "flexible-transcript", path = "../../transcript", versi
ciphersuite = { path = "../../ciphersuite", version = "^0.4.1", default-features = false, features = ["std"] } ciphersuite = { path = "../../ciphersuite", version = "^0.4.1", default-features = false, features = ["std"] }
dleq = { path = "../../dleq", version = "^0.4.1", default-features = false, features = ["std", "serialize"] } dleq = { path = "../../dleq", version = "^0.4.1", default-features = false, features = ["std", "serialize"] }
dkg = { path = "../", version = "0.6", default-features = false, features = ["std"] } dkg = { path = "../", version = "0.6.1", default-features = false, features = ["std"] }
[dev-dependencies] [dev-dependencies]
zeroize = { version = "^1.5", default-features = false, features = ["std", "zeroize_derive"] } zeroize = { version = "^1.5", default-features = false, features = ["std", "zeroize_derive"] }

View File

@@ -104,12 +104,12 @@ impl<C1: Ciphersuite, C2: Ciphersuite<F = C1::F, G = C1::G>> GeneratorPromotion<
) -> (GeneratorPromotion<C1, C2>, GeneratorProof<C1>) { ) -> (GeneratorPromotion<C1, C2>, GeneratorProof<C1>) {
// Do a DLEqProof for the new generator // Do a DLEqProof for the new generator
let proof = GeneratorProof { let proof = GeneratorProof {
share: C2::generator() * base.secret_share().deref(), share: C2::generator() * base.original_secret_share().deref(),
proof: DLEqProof::prove( proof: DLEqProof::prove(
rng, rng,
&mut transcript(&base.original_group_key(), base.params().i()), &mut transcript(&base.original_group_key(), base.params().i()),
&[C1::generator(), C2::generator()], &[C1::generator(), C2::generator()],
base.secret_share(), base.original_secret_share(),
), ),
}; };
@@ -159,7 +159,7 @@ impl<C1: Ciphersuite, C2: Ciphersuite<F = C1::F, G = C1::G>> GeneratorPromotion<
ThresholdKeys::new( ThresholdKeys::new(
params, params,
self.base.interpolation().clone(), self.base.interpolation().clone(),
self.base.secret_share().clone(), self.base.original_secret_share().clone(),
verification_shares, verification_shares,
) )
.unwrap(), .unwrap(),

View File

@@ -99,13 +99,16 @@ fn test_generator_promotion() {
for (i, promoting) in promotions.drain() { for (i, promoting) in promotions.drain() {
let promoted = promoting.complete(&clone_without(&proofs, &i)).unwrap(); let promoted = promoting.complete(&clone_without(&proofs, &i)).unwrap();
assert_eq!(keys[usize::from(u16::from(i) - 1)].params(), promoted.params()); assert_eq!(keys[usize::from(u16::from(i) - 1)].params(), promoted.params());
assert_eq!(keys[usize::from(u16::from(i) - 1)].secret_share(), promoted.secret_share()); assert_eq!(
keys[usize::from(u16::from(i) - 1)].original_secret_share(),
promoted.original_secret_share()
);
assert_eq!(new_group_key, promoted.group_key()); assert_eq!(new_group_key, promoted.group_key());
for l in 0 .. PARTICIPANTS { for l in 0 .. PARTICIPANTS {
let verification_share = let verification_share =
promoted.original_verification_share(Participant::new(l + 1).unwrap()); promoted.original_verification_share(Participant::new(l + 1).unwrap());
assert_eq!( assert_eq!(
AltGenerator::<Ristretto>::generator() * **keys[usize::from(l)].secret_share(), AltGenerator::<Ristretto>::generator() * **keys[usize::from(l)].original_secret_share(),
verification_share verification_share
); );
} }

View File

@@ -444,8 +444,8 @@ impl<C: Ciphersuite> ThresholdKeys<C> {
(self.core.group_key * self.scalar) + (C::generator() * self.offset) (self.core.group_key * self.scalar) + (C::generator() * self.offset)
} }
/// Return the secret share for these keys. /// Return the underlying secret share for these keys, without any tweaks applied.
pub fn secret_share(&self) -> &Zeroizing<C::F> { pub fn original_secret_share(&self) -> &Zeroizing<C::F> {
&self.core.secret_share &self.core.secret_share
} }
@@ -489,7 +489,7 @@ impl<C: Ciphersuite> ThresholdKeys<C> {
} }
// The interpolation occurs multiplicatively, letting us scale by the scalar now // The interpolation occurs multiplicatively, letting us scale by the scalar now
let secret_share_scaled = Zeroizing::new(self.scalar * self.secret_share().deref()); let secret_share_scaled = Zeroizing::new(self.scalar * self.original_secret_share().deref());
let mut secret_share = Zeroizing::new( let mut secret_share = Zeroizing::new(
self.core.interpolation.interpolation_factor(self.params().i(), &included) * self.core.interpolation.interpolation_factor(self.params().i(), &included) *
secret_share_scaled.deref(), secret_share_scaled.deref(),

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "modular-frost" name = "modular-frost"
version = "0.10.0" version = "0.10.1"
description = "Modular implementation of FROST over ff/group" description = "Modular implementation of FROST over ff/group"
license = "MIT" license = "MIT"
repository = "https://github.com/serai-dex/serai/tree/develop/crypto/frost" repository = "https://github.com/serai-dex/serai/tree/develop/crypto/frost"
@@ -39,7 +39,7 @@ multiexp = { path = "../multiexp", version = "0.4", default-features = false, fe
schnorr = { package = "schnorr-signatures", path = "../schnorr", version = "^0.5.1", default-features = false, features = ["std"] } schnorr = { package = "schnorr-signatures", path = "../schnorr", version = "^0.5.1", default-features = false, features = ["std"] }
dkg = { path = "../dkg", version = "0.6", default-features = false, features = ["std"] } dkg = { path = "../dkg", version = "0.6.1", default-features = false, features = ["std"] }
dkg-recovery = { path = "../dkg/recovery", version = "0.6", default-features = false, features = ["std"], optional = true } dkg-recovery = { path = "../dkg/recovery", version = "0.6", default-features = false, features = ["std"], optional = true }
dkg-dealer = { path = "../dkg/dealer", version = "0.6", default-features = false, features = ["std"], optional = true } dkg-dealer = { path = "../dkg/dealer", version = "0.6", default-features = false, features = ["std"], optional = true }

View File

@@ -125,8 +125,11 @@ impl<C: Curve, A: Algorithm<C>> AlgorithmMachine<C, A> {
let mut params = self.params; let mut params = self.params;
let mut rng = ChaCha20Rng::from_seed(*seed.0); let mut rng = ChaCha20Rng::from_seed(*seed.0);
let (nonces, commitments) = let (nonces, commitments) = Commitments::new::<_>(
Commitments::new::<_>(&mut rng, params.keys.secret_share(), &params.algorithm.nonces()); &mut rng,
params.keys.original_secret_share(),
&params.algorithm.nonces(),
);
let addendum = params.algorithm.preprocess_addendum(&mut rng, &params.keys); let addendum = params.algorithm.preprocess_addendum(&mut rng, &params.keys);
let preprocess = Preprocess { commitments, addendum }; let preprocess = Preprocess { commitments, addendum };

View File

@@ -133,7 +133,7 @@ fn vectors_to_multisig_keys<C: Curve>(vectors: &Vectors) -> HashMap<Participant,
assert_eq!(usize::from(these_keys.params().n()), shares.len()); assert_eq!(usize::from(these_keys.params().n()), shares.len());
let participant = Participant::new(i).unwrap(); let participant = Participant::new(i).unwrap();
assert_eq!(these_keys.params().i(), participant); assert_eq!(these_keys.params().i(), participant);
assert_eq!(these_keys.secret_share().deref(), &shares[usize::from(i - 1)]); assert_eq!(these_keys.original_secret_share().deref(), &shares[usize::from(i - 1)]);
assert_eq!(hex::encode(these_keys.group_key().to_bytes().as_ref()), vectors.group_key); assert_eq!(hex::encode(these_keys.group_key().to_bytes().as_ref()), vectors.group_key);
keys.insert(participant, these_keys); keys.insert(participant, these_keys);
} }
@@ -346,13 +346,20 @@ pub fn test_with_vectors<R: RngCore + CryptoRng, C: Curve, H: Hram<C>>(
// Calculate the expected nonces // Calculate the expected nonces
let mut expected = (C::generator() * let mut expected = (C::generator() *
C::random_nonce(keys[i].secret_share(), &mut TransparentRng(vec![randomness.0])).deref()) C::random_nonce(
keys[i].original_secret_share(),
&mut TransparentRng(vec![randomness.0]),
)
.deref())
.to_bytes() .to_bytes()
.as_ref() .as_ref()
.to_vec(); .to_vec();
expected.extend( expected.extend(
(C::generator() * (C::generator() *
C::random_nonce(keys[i].secret_share(), &mut TransparentRng(vec![randomness.1])) C::random_nonce(
keys[i].original_secret_share(),
&mut TransparentRng(vec![randomness.1]),
)
.deref()) .deref())
.to_bytes() .to_bytes()
.as_ref(), .as_ref(),