Skip to content

Commit 9a8133d

Browse files
committed
Verify attestations to threshold aggregate public key
1 parent c1ac7d1 commit 9a8133d

File tree

2 files changed

+28
-8
lines changed

2 files changed

+28
-8
lines changed

frost-secp256k1-tr/src/keys/dkg.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,3 +139,26 @@ pub fn attest_to_key_package<R: RngCore + CryptoRng>(key_package: KeyPackage, mu
139139

140140
Ok(signature)
141141
}
142+
143+
144+
/// Verify a n signatures over the aggregate threshold key package
145+
pub fn verify_round3_attestations(public_key_package: &PublicKeyPackage, attestations: &BTreeMap<Identifier, Signature>) -> Result<(), Error> {
146+
assert!(attestations.len() == public_key_package.verifying_shares().len());
147+
// sort both maps by identifier
148+
149+
let vpk = public_key_package.verifying_key();
150+
let G = <Secp256K1Sha256TR as Ciphersuite>::Group::generator();
151+
// TODO: figure out ordering of keys in public_key_package and signatures
152+
for (identifier, vs) in public_key_package.verifying_shares().iter() {
153+
let signature = attestations.get(identifier).ok_or(Error::InvalidSignature)?;
154+
let R = signature.R();
155+
let z = signature.z();
156+
let challenge = challenge_key_package(identifier, &vpk, vs, &R)?;
157+
// Schnorr verification
158+
if *R != G * z - vs.to_element() * challenge.to_scalar() {
159+
return Err(Error::InvalidSignature);
160+
}
161+
}
162+
163+
Ok(())
164+
}

frost-secp256k1-tr/tests/round3_attestations.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,14 @@ fn sign_key_package() -> Result<(), Box<dyn Error>> {
1717
&mut rng,
1818
)?;
1919
let mut key_packages: BTreeMap<_, _> = BTreeMap::new();
20+
let mut signatures: BTreeMap<_, _> = BTreeMap::new();
2021
for (identifier, secret_share) in shares {
2122
let key_package = frost::keys::KeyPackage::try_from(secret_share)?;
22-
key_packages.insert(identifier, key_package);
23+
key_packages.insert(identifier, key_package.clone());
24+
let signature = frost::keys::dkg::attest_to_key_package(key_package, &mut rng)?;
25+
signatures.insert(identifier, signature);
2326
}
2427

25-
let identifier = key_packages.keys().next().unwrap();
26-
let key_package = key_packages.get(identifier).unwrap().clone();
27-
let signature = frost::keys::dkg::attest_to_key_package(key_package, &mut rng)?;
28-
29-
println!("Signature: {:?}", signature);
30-
// TODO verify signature
31-
28+
frost::keys::dkg::verify_round3_attestations(&pubkey_package, &signatures)?;
3229
Ok(())
3330
}

0 commit comments

Comments
 (0)