Skip to content

Commit 014541e

Browse files
committed
Reduce code duplication
1 parent ef14fb5 commit 014541e

File tree

3 files changed

+135
-117
lines changed

3 files changed

+135
-117
lines changed

crates/dkg/src/dkg_math.rs

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,29 @@ mod tests {
334334
use crate::types::*;
335335
use bls12_381::*;
336336

337+
// Helper functions to reduce test code duplication
338+
339+
fn hex_to_bls_g1(hex_str: &str) -> BlsG1 {
340+
let pk_raw: BLSPubkeyRaw = hex::decode(hex_str).unwrap().try_into().unwrap();
341+
BlsG1 {
342+
g1: G1Affine::from_compressed(&pk_raw).into_option().unwrap(),
343+
}
344+
}
345+
346+
fn hexes_to_bls_g1s(hex_strings: &[&str]) -> Vec<BlsG1> {
347+
hex_strings.iter().map(|hex| hex_to_bls_g1(hex)).collect()
348+
}
349+
350+
fn hex_to_g1_affine(hex_str: &str) -> G1Affine {
351+
let pk_raw: BLSPubkeyRaw = hex::decode(hex_str).unwrap().try_into().unwrap();
352+
G1Affine::from_compressed(&pk_raw).into_option().unwrap()
353+
}
354+
355+
fn hex_to_g2_affine(hex_str: &str) -> G2Affine {
356+
let sig_raw: BLSSignatureRaw = hex::decode(hex_str).unwrap().try_into().unwrap();
357+
G2Affine::from_compressed(&sig_raw).into_option().unwrap()
358+
}
359+
337360
use super::*;
338361

339362
#[test]
@@ -377,34 +400,27 @@ mod tests {
377400
fn test_verify_signature() {
378401
let data = hex::decode("2f901d5cec8722e44afd59e94d0a56bf1506a72a0a60709920aad714d1a2ece0")
379402
.unwrap();
380-
let pk: BLSPubkeyRaw = hex::decode("90346f9c5f3c09d96ea02acd0220daa8459f03866ed938c798e3716e42c7e033c9a7ef66a10f83af06d5c00b508c6d0f").unwrap().try_into().unwrap();
381-
let sig:BLSSignatureRaw = hex::decode("a9c08eff13742f78f1e5929888f223b5b5b12b4836b5417c5a135cf24f4e2a4c66a6cdef91be3098b7e7a6a63903b61302e3cf2b8653101da245cf01a8d82b25debe7b18a3a2eb1778f8628fd2c59c8687f6e048a31250fbc2804c20043b8443").unwrap().try_into().unwrap();
382-
let pk = G1Affine::from_compressed(&pk).into_option().unwrap();
383-
let sig = G2Affine::from_compressed(&sig).into_option().unwrap();
403+
let pk = hex_to_g1_affine("90346f9c5f3c09d96ea02acd0220daa8459f03866ed938c798e3716e42c7e033c9a7ef66a10f83af06d5c00b508c6d0f");
404+
let sig = hex_to_g2_affine("a9c08eff13742f78f1e5929888f223b5b5b12b4836b5417c5a135cf24f4e2a4c66a6cdef91be3098b7e7a6a63903b61302e3cf2b8653101da245cf01a8d82b25debe7b18a3a2eb1778f8628fd2c59c8687f6e048a31250fbc2804c20043b8443");
384405
assert!(bls_verify(&pk, &sig, &data));
385406

386407
let invalida_data = hex::decode("00").unwrap();
387408
assert!(!bls_verify(&pk, &sig, &invalida_data));
388409

389-
let wrong_pk: BLSPubkeyRaw = hex::decode("98876a81fe982573ec5f986956bf9bf0bcb5349d95c3c8da0aefd05a49fea6215f59b0696f906547baed90ab245804e8").unwrap().try_into().unwrap();
390-
let wrong_pk = G1Affine::from_compressed(&wrong_pk).into_option().unwrap();
410+
let wrong_pk = hex_to_g1_affine("98876a81fe982573ec5f986956bf9bf0bcb5349d95c3c8da0aefd05a49fea6215f59b0696f906547baed90ab245804e8");
391411
assert!(!bls_verify(&wrong_pk, &sig, &data));
392412

393-
let bad_sig: BLSSignatureRaw = hex::decode("999e7b24bee2587d687e8f358ed10627ef57ec54935bd7a500bbbb18a57e7aa21b800f8b1f487a980d7c93918fdbd8020b66ce9a9e5788a4826e610ac937d8c2ce0ad9c0ee9a5732cf73052493e9a500cc5100a15bdbf9e5b79104db52dbf07c").unwrap().try_into().unwrap();
394-
let bad_sig = G2Affine::from_compressed(&bad_sig).into_option().unwrap();
413+
let bad_sig = hex_to_g2_affine("999e7b24bee2587d687e8f358ed10627ef57ec54935bd7a500bbbb18a57e7aa21b800f8b1f487a980d7c93918fdbd8020b66ce9a9e5788a4826e610ac937d8c2ce0ad9c0ee9a5732cf73052493e9a500cc5100a15bdbf9e5b79104db52dbf07c");
395414
assert!(!bls_verify(&pk, &bad_sig, &data))
396415
}
397416

398417
#[test]
399418
fn test_evaluate_polynomial() {
400-
let pks: Vec<BlsG1> = [
419+
let pks = hexes_to_bls_g1s(&[
401420
"92cad77a95432bc1030d81b5465cb69be672c1dd0da752230bf8112f8449b03149e7fa208a6fae460a9f0a1d5bd175e9",
402421
"98876a81fe982573ec5f986956bf9bf0bcb5349d95c3c8da0aefd05a49fea6215f59b0696f906547baed90ab245804e8",
403-
"ad2c4e5b631fbded449ede4dca2d040b9c7eae58d1e73b3050486c1ba22c15a92d9ff13c05c356f974447e4fca84864a"]
404-
.iter().map(|pk| -> BLSPubkeyRaw {
405-
hex::decode(pk).unwrap().try_into().unwrap()
406-
})
407-
.map(|pk| BlsG1{ g1: G1Affine::from_compressed(&pk).into_option().unwrap() }).collect();
422+
"ad2c4e5b631fbded449ede4dca2d040b9c7eae58d1e73b3050486c1ba22c15a92d9ff13c05c356f974447e4fca84864a",
423+
]);
408424

409425
let target = "af8e0095ecc662f65b95ce57e5bd2f8739ff93b0621a1ad53f5616538d1323ff40e6e9ddd7132298710974fe6fc0344e";
410426

@@ -417,14 +433,11 @@ mod tests {
417433

418434
#[test]
419435
fn test_evaluate_polynomial_bad_base_keys() {
420-
let pks: Vec<BlsG1> = [
436+
let pks = hexes_to_bls_g1s(&[
421437
"92cad77a95432bc1030d81b5465cb69be672c1dd0da752230bf8112f8449b03149e7fa208a6fae460a9f0a1d5bd175e9",
422438
"92cad77a95432bc1030d81b5465cb69be672c1dd0da752230bf8112f8449b03149e7fa208a6fae460a9f0a1d5bd175e9",
423-
"92cad77a95432bc1030d81b5465cb69be672c1dd0da752230bf8112f8449b03149e7fa208a6fae460a9f0a1d5bd175e9"]
424-
.iter().map(|pk| -> BLSPubkeyRaw {
425-
hex::decode(pk).unwrap().try_into().unwrap()
426-
})
427-
.map(|pk| BlsG1{ g1: G1Affine::from_compressed(&pk).into_option().unwrap() }).collect();
439+
"92cad77a95432bc1030d81b5465cb69be672c1dd0da752230bf8112f8449b03149e7fa208a6fae460a9f0a1d5bd175e9",
440+
]);
428441

429442
let target = "af8e0095ecc662f65b95ce57e5bd2f8739ff93b0621a1ad53f5616538d1323ff40e6e9ddd7132298710974fe6fc0344e";
430443

@@ -437,16 +450,13 @@ mod tests {
437450

438451
#[test]
439452
fn test_lagrange_interpolation() {
440-
let pks: Vec<BlsG1> = [
453+
let pks = hexes_to_bls_g1s(&[
441454
"8da434e68daef9af33e39ab727557a3cd86d7991cd6b545746bf92c8edec37012912cfa2292a21512bce9040a1c0e502",
442455
"a3cd061aab6013f7561978959482d79e9ca636392bc94d4bcad9cb6f90fe2cdf52100f211052f1570db0ca690b6a9903",
443456
"8cbfb6cb7af927cfe5fb17621df7036de539b7ff4aa0620cdc218d6b7fe7f2e714a96bdeddb2a0dc24867a90594427e1",
444457
"9892b390d9d3000c7bf04763006fbc617b7ba9c261fff35094aec3f43599f2c254ae667d9ba135747309b77cd02f1fbc",
445-
"b255c8a66fd1a13373537e8a4ba258f4990c141fc3c06daccda0711f5ebaffc092f0e5b0e4454e6344e2f97957be4017"]
446-
.iter().map(|pk| -> BLSPubkeyRaw {
447-
hex::decode(pk).unwrap().try_into().unwrap()
448-
})
449-
.map(|pk| BlsG1{ g1: G1Affine::from_compressed(&pk).into_option().unwrap()}).collect();
458+
"b255c8a66fd1a13373537e8a4ba258f4990c141fc3c06daccda0711f5ebaffc092f0e5b0e4454e6344e2f97957be4017",
459+
]);
450460

451461
let target = "a31d9a483703cd0da9873e5e76b4de5f7035d0a73d79b3be8667daa4fc7065a1bbb5bf77787fcf2a35bd327eecc4fa6b";
452462

@@ -465,17 +475,13 @@ mod tests {
465475

466476
#[test]
467477
fn test_lagrange_interpolation_out_of_order() {
468-
let pks: Vec<BlsG1> = [
478+
let pks = hexes_to_bls_g1s(&[
469479
"b255c8a66fd1a13373537e8a4ba258f4990c141fc3c06daccda0711f5ebaffc092f0e5b0e4454e6344e2f97957be4017",
470480
"8da434e68daef9af33e39ab727557a3cd86d7991cd6b545746bf92c8edec37012912cfa2292a21512bce9040a1c0e502",
471481
"a3cd061aab6013f7561978959482d79e9ca636392bc94d4bcad9cb6f90fe2cdf52100f211052f1570db0ca690b6a9903",
472482
"8cbfb6cb7af927cfe5fb17621df7036de539b7ff4aa0620cdc218d6b7fe7f2e714a96bdeddb2a0dc24867a90594427e1",
473483
"9892b390d9d3000c7bf04763006fbc617b7ba9c261fff35094aec3f43599f2c254ae667d9ba135747309b77cd02f1fbc",
474-
]
475-
.iter().map(|pk| -> BLSPubkeyRaw {
476-
hex::decode(pk).unwrap().try_into().unwrap()
477-
})
478-
.map(|pk| BlsG1{ g1: G1Affine::from_compressed(&pk).into_option().unwrap()}).collect();
484+
]);
479485

480486
let target = "a31d9a483703cd0da9873e5e76b4de5f7035d0a73d79b3be8667daa4fc7065a1bbb5bf77787fcf2a35bd327eecc4fa6b";
481487

@@ -494,16 +500,13 @@ mod tests {
494500

495501
#[test]
496502
fn test_lagrange_interpolation_wrong_order() {
497-
let pks: Vec<BlsG1> = [
503+
let pks = hexes_to_bls_g1s(&[
498504
"a3cd061aab6013f7561978959482d79e9ca636392bc94d4bcad9cb6f90fe2cdf52100f211052f1570db0ca690b6a9903",
499505
"8da434e68daef9af33e39ab727557a3cd86d7991cd6b545746bf92c8edec37012912cfa2292a21512bce9040a1c0e502",
500506
"8cbfb6cb7af927cfe5fb17621df7036de539b7ff4aa0620cdc218d6b7fe7f2e714a96bdeddb2a0dc24867a90594427e1",
501507
"9892b390d9d3000c7bf04763006fbc617b7ba9c261fff35094aec3f43599f2c254ae667d9ba135747309b77cd02f1fbc",
502-
"b255c8a66fd1a13373537e8a4ba258f4990c141fc3c06daccda0711f5ebaffc092f0e5b0e4454e6344e2f97957be4017"]
503-
.iter().map(|pk| -> BLSPubkeyRaw {
504-
hex::decode(pk).unwrap().try_into().unwrap()
505-
})
506-
.map(|pk| BlsG1{ g1: G1Affine::from_compressed(&pk).into_option().unwrap()}).collect();
508+
"b255c8a66fd1a13373537e8a4ba258f4990c141fc3c06daccda0711f5ebaffc092f0e5b0e4454e6344e2f97957be4017",
509+
]);
507510

508511
let target = "a31d9a483703cd0da9873e5e76b4de5f7035d0a73d79b3be8667daa4fc7065a1bbb5bf77787fcf2a35bd327eecc4fa6b";
509512

@@ -522,16 +525,13 @@ mod tests {
522525

523526
#[test]
524527
fn test_lagrange_interpolation_wrong_base_keys() {
525-
let pks: Vec<BlsG1> = [
528+
let pks = hexes_to_bls_g1s(&[
526529
"a3cd061aab6013f7561978959482d79e9ca636392bc94d4bcad9cb6f90fe2cdf52100f211052f1570db0ca690b6a9903",
527530
"a3cd061aab6013f7561978959482d79e9ca636392bc94d4bcad9cb6f90fe2cdf52100f211052f1570db0ca690b6a9903",
528531
"a3cd061aab6013f7561978959482d79e9ca636392bc94d4bcad9cb6f90fe2cdf52100f211052f1570db0ca690b6a9903",
529532
"a3cd061aab6013f7561978959482d79e9ca636392bc94d4bcad9cb6f90fe2cdf52100f211052f1570db0ca690b6a9903",
530-
"a3cd061aab6013f7561978959482d79e9ca636392bc94d4bcad9cb6f90fe2cdf52100f211052f1570db0ca690b6a9903"]
531-
.iter().map(|pk| -> BLSPubkeyRaw {
532-
hex::decode(pk).unwrap().try_into().unwrap()
533-
})
534-
.map(|pk| BlsG1{ g1: G1Affine::from_compressed(&pk).into_option().unwrap()}).collect();
533+
"a3cd061aab6013f7561978959482d79e9ca636392bc94d4bcad9cb6f90fe2cdf52100f211052f1570db0ca690b6a9903",
534+
]);
535535

536536
let target = "a31d9a483703cd0da9873e5e76b4de5f7035d0a73d79b3be8667daa4fc7065a1bbb5bf77787fcf2a35bd327eecc4fa6b";
537537

crates/dkg/src/verification.rs

Lines changed: 55 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -148,10 +148,10 @@ where
148148
Ok(())
149149
}
150150

151-
pub fn compute_initial_commitment_hash<Setup>(
151+
fn compute_base_hash<Setup>(
152152
settings: &GenerateSettings,
153-
base_pubkeys: &Vec<RawBytes<Setup::Point>>,
154-
) -> SHA256Raw
153+
pubkeys: &[RawBytes<Setup::Point>],
154+
) -> Sha256
155155
where
156156
Setup: DkgSetup + DkgSetupTypes<Setup>,
157157
{
@@ -161,13 +161,24 @@ where
161161
hasher.update([settings.n]);
162162
hasher.update([settings.k]);
163163

164-
let len = base_pubkeys.len() as u8;
164+
let len = pubkeys.len() as u8;
165165
hasher.update([len]);
166166

167-
for pubkey in base_pubkeys {
167+
for pubkey in pubkeys {
168168
hasher.update(pubkey.as_arr());
169169
}
170+
170171
hasher
172+
}
173+
174+
pub fn compute_initial_commitment_hash<Setup>(
175+
settings: &GenerateSettings,
176+
base_pubkeys: &Vec<RawBytes<Setup::Point>>,
177+
) -> SHA256Raw
178+
where
179+
Setup: DkgSetup + DkgSetupTypes<Setup>,
180+
{
181+
compute_base_hash::<Setup>(settings, base_pubkeys)
171182
.finalize()
172183
.to_vec()
173184
.try_into()
@@ -200,6 +211,42 @@ where
200211
}
201212
}
202213

214+
fn deserialize_verification_vectors<Setup>(
215+
generations: &[Generation<Setup>],
216+
) -> Vec<Vec<Setup::Point>>
217+
where
218+
Setup: DkgSetup + DkgSetupTypes<Setup>,
219+
{
220+
generations
221+
.iter()
222+
.map(|generation| -> Vec<Setup::Point> {
223+
generation
224+
.verification_vector
225+
.iter()
226+
.map(|pt| Setup::Point::from_bytes(pt).expect("Invalid point"))
227+
.collect()
228+
})
229+
.collect()
230+
}
231+
232+
fn deserialize_bad_partial_share_verification_vectors<Setup>(
233+
generations: &[BadPartialShareGeneration<Setup>],
234+
) -> Vec<Vec<Setup::Point>>
235+
where
236+
Setup: DkgSetup + DkgSetupTypes<Setup>,
237+
{
238+
generations
239+
.iter()
240+
.map(|generation| -> Vec<Setup::Point> {
241+
generation
242+
.verification_vector
243+
.iter()
244+
.map(|pt| Setup::Point::from_bytes(pt).expect("Invalid point"))
245+
.collect()
246+
})
247+
.collect()
248+
}
249+
203250
fn compute_agg_key_from_dkg<C: Curve>(
204251
verification_vectors: &[Vec<C::Point>],
205252
_ids: &[C::Scalar],
@@ -285,16 +332,7 @@ where
285332
let mut sorted = generations.to_vec();
286333
sorted.sort_by(|a, b| a.base_hash.cmp(&b.base_hash));
287334

288-
let verification_vectors: Vec<Vec<Setup::Point>> = sorted
289-
.iter()
290-
.map(|generation| -> Vec<Setup::Point> {
291-
generation
292-
.verification_vector
293-
.iter()
294-
.map(|pt| Setup::Point::from_bytes(pt).expect("Invalid point"))
295-
.collect()
296-
})
297-
.collect();
335+
let verification_vectors = deserialize_verification_vectors::<Setup>(&sorted);
298336

299337
let ids: Vec<Setup::Scalar> = sorted
300338
.iter()
@@ -344,17 +382,7 @@ pub fn compute_partial_share_hash<Setup>(
344382
where
345383
Setup: DkgSetup + DkgSetupTypes<Setup>,
346384
{
347-
let mut hasher = Sha256::new();
348-
hasher.update(settings.gen_id.as_ref());
349-
hasher.update([settings.n]);
350-
hasher.update([settings.k]);
351-
352-
let len = partial_share.data.verification_vector.len() as u8;
353-
hasher.update([len]);
354-
355-
for pubkey in &partial_share.data.verification_vector {
356-
hasher.update(pubkey.as_arr());
357-
}
385+
let mut hasher = compute_base_hash::<Setup>(settings, &partial_share.data.verification_vector);
358386

359387
hasher.update(partial_share.data.base_hash.as_ref());
360388
hasher.update(partial_share.data.partial_pubkey.as_arr());
@@ -533,17 +561,7 @@ fn compute_pubkey_share<Setup>(
533561
where
534562
Setup: DkgSetup + DkgSetupTypes<Setup>,
535563
{
536-
let verification_vectors: Vec<Vec<Setup::Point>> = sorted
537-
.iter()
538-
.map(|generation| {
539-
generation
540-
.verification_vector
541-
.iter()
542-
.map(Setup::Point::from_bytes)
543-
.map(|x| x.expect("Invalid pubkey"))
544-
.collect()
545-
})
546-
.collect();
564+
let verification_vectors = deserialize_bad_partial_share_verification_vectors::<Setup>(sorted);
547565

548566
let computed_keys_coeffs = agg_coefficients::<Setup::Curve>(&verification_vectors);
549567
let expected_key = evaluate_polynomial::<Setup::Curve>(&computed_keys_coeffs, perpetrator_id);

0 commit comments

Comments
 (0)