@@ -45,6 +45,7 @@ use curv::BigInt;
45
45
use curv:: FE ;
46
46
use curv:: GE ;
47
47
48
+ use zeroize:: Zeroize ;
48
49
use Error :: { self , InvalidSig } ;
49
50
50
51
use subtle:: ConstantTimeEq ;
@@ -141,10 +142,10 @@ impl KeyGenFirstMsg {
141
142
pub fn create_commitments ( ) -> ( KeyGenFirstMsg , CommWitness , EcKeyPair ) {
142
143
let base: GE = ECPoint :: generator ( ) ;
143
144
144
- let secret_share : FE = ECScalar :: new_random ( ) ;
145
+ let mut scalar : FE = ECScalar :: new_random ( ) ;
145
146
//in Lindell's protocol range proof works only for x1<q/3
146
- let secret_share: FE =
147
- ECScalar :: from ( & secret_share . to_big_int ( ) . div_floor ( & BigInt :: from ( 3 ) ) ) ;
147
+ let mut secret_share: FE = ECScalar :: from ( & scalar . to_big_int ( ) . div_floor ( & BigInt :: from ( 3 ) ) ) ;
148
+ scalar . zeroize ( ) ;
148
149
149
150
let public_share = base. scalar_mul ( & secret_share. get_element ( ) ) ;
150
151
@@ -167,6 +168,7 @@ impl KeyGenFirstMsg {
167
168
public_share,
168
169
secret_share,
169
170
} ;
171
+ secret_share. zeroize ( ) ;
170
172
(
171
173
KeyGenFirstMsg {
172
174
pk_commitment,
@@ -183,7 +185,7 @@ impl KeyGenFirstMsg {
183
185
}
184
186
185
187
pub fn create_commitments_with_fixed_secret_share (
186
- secret_share : FE ,
188
+ mut secret_share : FE ,
187
189
) -> ( KeyGenFirstMsg , CommWitness , EcKeyPair ) {
188
190
//in Lindell's protocol range proof works only for x1<q/3
189
191
let sk_bigint = secret_share. to_big_int ( ) ;
@@ -212,6 +214,7 @@ impl KeyGenFirstMsg {
212
214
public_share,
213
215
secret_share,
214
216
} ;
217
+ secret_share. zeroize ( ) ;
215
218
(
216
219
KeyGenFirstMsg {
217
220
pk_commitment,
@@ -411,7 +414,7 @@ impl PaillierKeyPair {
411
414
let b = pdl_party_two_second_message. decommit . b . clone ( ) ;
412
415
let blindness = pdl_party_two_second_message. decommit . blindness . clone ( ) ;
413
416
414
- let ab_concat = a. clone ( ) + b. clone ( ) . shl ( a. bit_length ( ) ) ;
417
+ let ab_concat = a. clone ( ) + b. clone ( ) . shl ( a. bit_length ( ) ) ; // b|a (in the paper it is a|b)
415
418
let c_tag_tag_test =
416
419
HashCommitment :: create_commitment_with_user_defined_randomness ( & ab_concat, & blindness) ;
417
420
let ax1 = a. clone ( ) * party_one_private. x1 . to_big_int ( ) ;
@@ -429,13 +432,13 @@ impl PaillierKeyPair {
429
432
impl EphKeyGenFirstMsg {
430
433
pub fn create ( ) -> ( EphKeyGenFirstMsg , EphEcKeyPair ) {
431
434
let base: GE = ECPoint :: generator ( ) ;
432
- let secret_share: FE = ECScalar :: new_random ( ) ;
435
+ let mut secret_share: FE = ECScalar :: new_random ( ) ;
433
436
let public_share = & base * & secret_share;
434
437
let h: GE = GE :: base_point2 ( ) ;
435
- let w = ECDDHWitness {
436
- x : secret_share. clone ( ) ,
437
- } ;
438
+
438
439
let c = & h * & secret_share;
440
+ let mut x = secret_share;
441
+ let w = ECDDHWitness { x } ;
439
442
let delta = ECDDHStatement {
440
443
g1 : base. clone ( ) ,
441
444
h1 : public_share. clone ( ) ,
@@ -447,6 +450,8 @@ impl EphKeyGenFirstMsg {
447
450
public_share : public_share. clone ( ) ,
448
451
secret_share,
449
452
} ;
453
+ secret_share. zeroize ( ) ;
454
+ x. zeroize ( ) ;
450
455
(
451
456
EphKeyGenFirstMsg {
452
457
d_log_proof,
@@ -517,17 +522,22 @@ impl Signature {
517
522
r = r. scalar_mul ( & ephemeral_local_share. secret_share . get_element ( ) ) ;
518
523
519
524
let rx = r. x_coor ( ) . unwrap ( ) . mod_floor ( & FE :: q ( ) ) ;
520
- let k1_inv = & ephemeral_local_share
521
- . secret_share
522
- . to_big_int ( )
523
- . invert ( & FE :: q ( ) )
524
- . unwrap ( ) ;
525
+
526
+ let mut k1_inv = ephemeral_local_share. secret_share . invert ( ) ;
527
+
525
528
let s_tag = Paillier :: decrypt (
526
529
& party_one_private. paillier_priv ,
527
530
& RawCiphertext :: from ( partial_sig_c3) ,
528
- ) ;
529
- let s_tag_tag = BigInt :: mod_mul ( & k1_inv, & s_tag. 0 , & FE :: q ( ) ) ;
530
- let s = cmp:: min ( s_tag_tag. clone ( ) , FE :: q ( ) . clone ( ) - s_tag_tag. clone ( ) ) ;
531
+ )
532
+ . 0 ;
533
+ let mut s_tag_fe: FE = ECScalar :: from ( & s_tag) ;
534
+ let s_tag_tag = s_tag_fe * k1_inv;
535
+ k1_inv. zeroize ( ) ;
536
+ s_tag_fe. zeroize ( ) ;
537
+ let s_tag_tag_bn = s_tag_tag. to_big_int ( ) ;
538
+
539
+ let s = cmp:: min ( s_tag_tag_bn. clone ( ) , FE :: q ( ) . clone ( ) - s_tag_tag_bn. clone ( ) ) ;
540
+
531
541
Signature { s, r : rx }
532
542
}
533
543
@@ -543,17 +553,19 @@ impl Signature {
543
553
544
554
let rx = r. x_coor ( ) . unwrap ( ) . mod_floor ( & FE :: q ( ) ) ;
545
555
let ry = r. y_coor ( ) . unwrap ( ) . mod_floor ( & FE :: q ( ) ) ;
546
- let k1_inv = & ephemeral_local_share
547
- . secret_share
548
- . to_big_int ( )
549
- . invert ( & FE :: q ( ) )
550
- . unwrap ( ) ;
556
+ let mut k1_inv = ephemeral_local_share. secret_share . invert ( ) ;
557
+
551
558
let s_tag = Paillier :: decrypt (
552
559
& party_one_private. paillier_priv ,
553
560
& RawCiphertext :: from ( partial_sig_c3) ,
554
- ) ;
555
- let s_tag_tag = BigInt :: mod_mul ( & k1_inv, & s_tag. 0 , & FE :: q ( ) ) ;
556
- let s = cmp:: min ( s_tag_tag. clone ( ) , FE :: q ( ) . clone ( ) - s_tag_tag. clone ( ) ) ;
561
+ )
562
+ . 0 ;
563
+ let mut s_tag_fe: FE = ECScalar :: from ( & s_tag) ;
564
+ let s_tag_tag = s_tag_fe * k1_inv;
565
+ k1_inv. zeroize ( ) ;
566
+ s_tag_fe. zeroize ( ) ;
567
+ let s_tag_tag_bn = s_tag_tag. to_big_int ( ) ;
568
+ let s = cmp:: min ( s_tag_tag_bn. clone ( ) , FE :: q ( ) . clone ( ) - s_tag_tag_bn. clone ( ) ) ;
557
569
558
570
/*
559
571
Calculate recovery id - it is not possible to compute the public key out of the signature
@@ -563,7 +575,7 @@ impl Signature {
563
575
*/
564
576
let is_ry_odd = ry. tstbit ( 0 ) ;
565
577
let mut recid = if is_ry_odd { 1 } else { 0 } ;
566
- if s_tag_tag . clone ( ) > FE :: q ( ) - s_tag_tag . clone ( ) {
578
+ if s_tag_tag_bn . clone ( ) > FE :: q ( ) - s_tag_tag_bn . clone ( ) {
567
579
recid = recid ^ 1 ;
568
580
}
569
581
0 commit comments