Skip to content

Commit 67d7591

Browse files
committed
new cclst proof
1 parent 55e0550 commit 67d7591

File tree

6 files changed

+79
-45
lines changed

6 files changed

+79
-45
lines changed

Cargo.toml

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "multi-party-ecdsa"
3-
version = "0.2.6"
3+
version = "0.2.7"
44
edition = "2018"
55
authors = [
66
@@ -45,8 +45,8 @@ git = "https://github.com/KZen-networks/centipede"
4545
tag = "v0.2.1"
4646

4747
[dependencies.class_group]
48-
git = "https://github.com/KZen-networks/class-groups"
49-
tag = "v0.1.5"
48+
git = "https://github.com/KZen-networks/class"
49+
tag = "v0.3.0"
5050
optional = true
5151

5252
[dev-dependencies]
@@ -77,17 +77,30 @@ name = "common"
7777
crate-type = ["lib"]
7878

7979
[[bench]]
80-
name = "cclst"
80+
name = "cclst_keygen"
8181
path = "benches/two_party_ecdsa/cclst_2019/keygen.rs"
8282
required-features = ["cclst"]
8383
harness = false
8484

85+
[[bench]]
86+
name = "cclst_sign"
87+
path = "benches/two_party_ecdsa/cclst_2019/sign.rs"
88+
required-features = ["cclst"]
89+
harness = false
90+
91+
8592
[[bench]]
8693
name = "gg18"
8794
path = "benches/multi_party_ecdsa/gg18/keygen.rs"
8895
harness = false
8996

9097
[[bench]]
91-
name = "lindel2017"
98+
name = "lindel2017_keygen"
9299
path = "benches/two_party_ecdsa/lindell_2017/keygen.rs"
93100
harness = false
101+
102+
103+
[[bench]]
104+
name = "lindel2017_sign"
105+
path = "benches/two_party_ecdsa/lindell_2017/sign.rs"
106+
harness = false

benches/two_party_ecdsa/cclst_2019/sign.rs

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@ mod bench {
66
use multi_party_ecdsa::protocols::two_party_ecdsa::cclst_2019::party_two::HSMCLPublic;
77
use multi_party_ecdsa::protocols::two_party_ecdsa::cclst_2019::*;
88

9-
pub fn bench_full_keygen_party_one_two(c: &mut Criterion) {
10-
c.bench_function("keygen", move |b| {
9+
pub fn bench_full_sign_party_one_two(c: &mut Criterion) {
10+
c.bench_function("sign", move |b| {
1111
b.iter(|| {
12+
// assume party1 and party2 engaged with KeyGen in the past resulting in
13+
// party1 owning private share and HSMCL key-pair
14+
// party2 owning private share and HSMCL encryption of party1 share
1215
let (_party_one_private_share_gen, _comm_witness, ec_key_pair_party1) =
1316
party_one::KeyGenFirstMsg::create_commitments();
1417
let (party_two_private_share_gen, ec_key_pair_party2) =
@@ -19,10 +22,15 @@ mod bench {
1922
&ec_key_pair_party1,
2023
);
2124

22-
let party_two_hsmcl_public = HSMCLPublic {
23-
ek: party_one_hsmcl_key_pair.keypair.pk.clone(),
24-
encrypted_secret_share: party_one_hsmcl_key_pair.encrypted_share.clone(),
25-
};
25+
let party1_private = party_one::Party1Private::set_private_key(
26+
&ec_key_pair_party1,
27+
&party_one_hsmcl_key_pair,
28+
);
29+
30+
let party_two_hsmcl_public = HSMCLPublic::set(
31+
&party_one_hsmcl_key_pair.keypair.pk,
32+
&party_one_hsmcl_key_pair.encrypted_share,
33+
);
2634
// creating the ephemeral private shares:
2735

2836
let (eph_party_two_first_message, eph_comm_witness, eph_ec_key_pair_party2) =
@@ -53,11 +61,6 @@ mod bench {
5361
&message,
5462
);
5563

56-
let party1_private = party_one::Party1Private::set_private_key(
57-
&ec_key_pair_party1,
58-
&party_one_hsmcl_key_pair,
59-
);
60-
6164
let signature = party_one::Signature::compute(
6265
&party1_private,
6366
partial_sig.c3,
@@ -75,9 +78,9 @@ mod bench {
7578
}
7679

7780
criterion_group! {
78-
name = keygen;
81+
name = sign;
7982
config = Criterion::default().sample_size(10);
80-
targets =self::bench_full_keygen_party_one_two}
83+
targets =self::bench_full_sign_party_one_two}
8184
}
8285

83-
criterion_main!(bench::keygen);
86+
criterion_main!(bench::sign);

benches/two_party_ecdsa/lindell_2017/sign.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
use criterion::criterion_main;
22

33
mod bench {
4-
use criterion::Criterion;
5-
use curv::arithmetic::traits::Samplable;
6-
use curv::elliptic::curves::traits::*;
4+
use criterion::{criterion_group, Criterion};
75
use curv::BigInt;
86
use multi_party_ecdsa::protocols::two_party_ecdsa::lindell_2017::*;
97

10-
pub fn bench_full_keygen_party_one_two(c: &mut Criterion) {
11-
c.bench_function("keygen", move |b| {
8+
pub fn bench_full_sign_party_one_two(c: &mut Criterion) {
9+
c.bench_function("sign", move |b| {
1210
b.iter(|| {
1311
let (_party_one_private_share_gen, _comm_witness, ec_key_pair_party1) =
1412
party_one::KeyGenFirstMsg::create_commitments();
@@ -69,9 +67,9 @@ mod bench {
6967
}
7068

7169
criterion_group! {
72-
name = keygen;
70+
name = sign;
7371
config = Criterion::default().sample_size(10);
74-
targets =self::bench_full_keygen_party_one_two}
72+
targets =self::bench_full_sign_party_one_two}
7573
}
7674

77-
criterion_main!(bench::keygen);
75+
criterion_main!(bench::sign);

src/protocols/two_party_ecdsa/cclst_2019/party_one.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
*/
1616
use std::cmp;
1717

18-
use class_group::primitives::Ciphertext;
19-
use class_group::primitives::Witness;
20-
use class_group::primitives::{CLDLProof, HSMCL};
18+
use class_group::primitives::cl_dl_lcm::Ciphertext;
19+
use class_group::primitives::cl_dl_lcm::Witness;
20+
use class_group::primitives::cl_dl_lcm::{CLDLProof, HSMCL};
2121
use curv::arithmetic::traits::*;
2222
use curv::cryptographic_primitives::commitments::hash_commitment::HashCommitment;
2323
use curv::cryptographic_primitives::commitments::traits::Commitment;
@@ -36,7 +36,6 @@ use subtle::ConstantTimeEq;
3636
use super::party_two::EphKeyGenFirstMsg as Party2EphKeyGenFirstMessage;
3737
use super::party_two::EphKeyGenSecondMsg as Party2EphKeyGenSecondMessage;
3838
use super::SECURITY_BITS;
39-
4039
use crate::Error::{self, InvalidSig};
4140

4241
//****************** Begin: Party One structs ******************//
@@ -365,6 +364,9 @@ impl Signature {
365364
ephemeral_local_share: &EphEcKeyPair,
366365
ephemeral_other_public_share: &GE,
367366
) -> Signature {
367+
let y_lcm_2_10 : BigInt = str::parse(
368+
"15161806181366890704755537519628428221282838501257142250824360639698299050776571382489681778825684381429314058890905101687022024744606800532531764952734582389201393752832486383043169059475949454418063248428056646723694341952991408637386677631205400831455008554143754794994126167401137152222379676492247471515691285702536834646805381995650206229354446213284302569283840180834930263739794772017863585682362821412785936104792844891075228278568320000",
369+
).unwrap();
368370
//compute r = k2* R1
369371
let mut r = ephemeral_other_public_share.clone();
370372
r = r.scalar_mul(&ephemeral_local_share.secret_share.get_element());
@@ -376,7 +378,7 @@ impl Signature {
376378
.invert(&FE::q())
377379
.unwrap();
378380
let s_tag = party_one_private.keypair.decrypt(&partial_sig_c3);
379-
381+
let s_tag = BigInt::mod_mul(&s_tag, &(y_lcm_2_10.invert(&FE::q()).unwrap()), &FE::q());
380382
let s_tag_tag = BigInt::mod_mul(&k1_inv, &s_tag, &FE::q());
381383
let s = cmp::min(s_tag_tag.clone(), FE::q().clone() - s_tag_tag.clone());
382384
Signature { s, r: rx }

src/protocols/two_party_ecdsa/cclst_2019/party_two.rs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414
@license GPL-3.0+ <https://github.com/KZen-networks/multi-party-ecdsa/blob/master/LICENSE>
1515
*/
1616

17-
use class_group::primitives::CLDLProof;
18-
use class_group::primitives::Ciphertext;
19-
use class_group::primitives::HSMCL;
20-
use class_group::primitives::PK as HSMCLPK;
17+
use class_group::primitives::cl_dl_lcm::CLDLProof;
18+
use class_group::primitives::cl_dl_lcm::Ciphertext;
19+
use class_group::primitives::cl_dl_lcm::HSMCL;
20+
use class_group::primitives::cl_dl_lcm::PK as HSMCLPK;
2121
use curv::arithmetic::traits::*;
2222
use curv::cryptographic_primitives::commitments::hash_commitment::HashCommitment;
2323
use curv::cryptographic_primitives::commitments::traits::Commitment;
@@ -201,6 +201,20 @@ impl KeyGenSecondMsg {
201201
}
202202
}
203203

204+
impl HSMCLPublic {
205+
pub fn set(ek: &HSMCLPK, encrypted_secret_share: &Ciphertext) -> HSMCLPublic {
206+
let y_lcm_2_10 : BigInt = str::parse(
207+
"15161806181366890704755537519628428221282838501257142250824360639698299050776571382489681778825684381429314058890905101687022024744606800532531764952734582389201393752832486383043169059475949454418063248428056646723694341952991408637386677631205400831455008554143754794994126167401137152222379676492247471515691285702536834646805381995650206229354446213284302569283840180834930263739794772017863585682362821412785936104792844891075228278568320000",
208+
).unwrap();
209+
let encrypted_share_y = HSMCL::eval_scal(encrypted_secret_share, &y_lcm_2_10);
210+
211+
HSMCLPublic {
212+
ek: ek.clone(),
213+
encrypted_secret_share: encrypted_share_y,
214+
}
215+
}
216+
}
217+
204218
pub fn compute_pubkey(local_share: &EcKeyPair, other_share_public_share: &GE) -> GE {
205219
let pubkey = other_share_public_share.clone();
206220
pubkey.scalar_mul(&local_share.secret_share.get_element())
@@ -215,7 +229,7 @@ impl Party2Private {
215229
}
216230

217231
impl HSMCLPublic {
218-
pub fn verify_zkcldl_proof(proof: CLDLProof) -> Result<(Self), ()> {
232+
pub fn verify_zkcldl_proof(proof: CLDLProof) -> Result<Self, ()> {
219233
let res = proof.verify();
220234
match res {
221235
Ok(_) => Ok(HSMCLPublic {
@@ -306,6 +320,9 @@ impl PartialSig {
306320
ephemeral_other_public_share: &GE,
307321
message: &BigInt,
308322
) -> PartialSig {
323+
let y_lcm_2_10 : BigInt = str::parse(
324+
"15161806181366890704755537519628428221282838501257142250824360639698299050776571382489681778825684381429314058890905101687022024744606800532531764952734582389201393752832486383043169059475949454418063248428056646723694341952991408637386677631205400831455008554143754794994126167401137152222379676492247471515691285702536834646805381995650206229354446213284302569283840180834930263739794772017863585682362821412785936104792844891075228278568320000",
325+
).unwrap();
309326
let q = FE::q();
310327
//compute r = k2* R1
311328
let mut r: GE = ephemeral_other_public_share.clone();
@@ -318,7 +335,8 @@ impl PartialSig {
318335
.invert(&q)
319336
.unwrap();
320337
let k2_inv_m = BigInt::mod_mul(&k2_inv, message, &q);
321-
let c1 = HSMCL::encrypt(&party_two_public.ek, &k2_inv_m);
338+
let k2_inv_m_y_lcm_2_10 = BigInt::mod_mul(&k2_inv_m, &y_lcm_2_10, &q);
339+
let c1 = HSMCL::encrypt(&party_two_public.ek, &k2_inv_m_y_lcm_2_10);
322340
let v = BigInt::mod_mul(&k2_inv, &local_share.x2.to_big_int(), &q);
323341
let v = BigInt::mod_mul(&v, &rx, &q);
324342

src/protocols/two_party_ecdsa/cclst_2019/test.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,13 @@ fn test_two_party_sign() {
7171
let party_one_hsmcl_key_pair =
7272
party_one::HSMCLKeyPair::generate_keypair_and_encrypted_share(&ec_key_pair_party1);
7373

74-
let party_two_hsmcl_public = HSMCLPublic {
75-
ek: party_one_hsmcl_key_pair.keypair.pk.clone(),
76-
encrypted_secret_share: party_one_hsmcl_key_pair.encrypted_share.clone(),
77-
};
74+
let party1_private =
75+
party_one::Party1Private::set_private_key(&ec_key_pair_party1, &party_one_hsmcl_key_pair);
76+
77+
let party_two_hsmcl_public = HSMCLPublic::set(
78+
&party_one_hsmcl_key_pair.keypair.pk,
79+
&party_one_hsmcl_key_pair.encrypted_share,
80+
);
7881
// creating the ephemeral private shares:
7982

8083
let (eph_party_two_first_message, eph_comm_witness, eph_ec_key_pair_party2) =
@@ -104,9 +107,6 @@ fn test_two_party_sign() {
104107
&message,
105108
);
106109

107-
let party1_private =
108-
party_one::Party1Private::set_private_key(&ec_key_pair_party1, &party_one_hsmcl_key_pair);
109-
110110
let signature = party_one::Signature::compute(
111111
&party1_private,
112112
partial_sig.c3,

0 commit comments

Comments
 (0)