File tree Expand file tree Collapse file tree 4 files changed +23
-12
lines changed
Expand file tree Collapse file tree 4 files changed +23
-12
lines changed Original file line number Diff line number Diff line change @@ -15,8 +15,6 @@ pub use self::keypair::keypair;
1515/// Calculate the upper and lower bounds for generating values like p or q
1616#[ inline]
1717fn calculate_bounds ( size : u32 ) -> ( BoxedUint , BoxedUint ) {
18- let lower = two ( ) . shl ( size - 1 ) ;
19- let upper = two ( ) . shl ( size) ;
2018 let lower = BoxedUint :: one ( ) . widen ( size + 1 ) . shl ( size - 1 ) ;
2119 let upper = BoxedUint :: one ( ) . widen ( size + 1 ) . shl ( size) ;
2220
Original file line number Diff line number Diff line change @@ -37,14 +37,15 @@ pub fn common(
3737 for _ in 0 ..4096 {
3838 let m = ' gen_m: loop {
3939 let m = BoxedUint :: random_bits ( rng, l) ;
40+
4041 if m > p_min && m < p_max {
4142 break ' gen_m m;
4243 }
4344 } ;
4445 let rem = NonZero :: new ( ( two ( ) * & * q) . widen ( m. bits_precision ( ) ) ) . unwrap ( ) ;
46+
4547 let mr = & m % & rem;
4648 let p = m - mr + BoxedUint :: one ( ) ;
47- let p = p. shorten ( q. bits_precision ( ) ) ;
4849 let p = NonZero :: new ( p) . unwrap ( ) ;
4950
5051 if crypto_primes:: is_prime_with_rng ( rng, & * p) {
@@ -53,9 +54,10 @@ pub fn common(
5354 }
5455 } ;
5556
57+ let q = q. widen ( l) ;
58+
5659 // Generate g using the unverifiable method as defined by Appendix A.2.1
5760 let e = ( & * p - & BoxedUint :: one ( ) ) / & q;
58- let mut h = BoxedUint :: one ( ) ;
5961 let mut h = BoxedUint :: one ( ) . widen ( q. bits_precision ( ) ) ;
6062 let g = loop {
6163 let params = BoxedMontyParams :: new_vartime ( Odd :: new ( ( * p) . clone ( ) ) . unwrap ( ) ) ;
@@ -69,6 +71,8 @@ pub fn common(
6971 h = h + BoxedUint :: one ( ) ;
7072 } ;
7173
74+ let q = NonZero :: new ( q. shorten ( n) ) . unwrap ( ) ;
75+
7276 ( p, q, g)
7377}
7478
Original file line number Diff line number Diff line change @@ -65,12 +65,15 @@ pub fn secret_number(
6565) -> Option < ( BoxedUint , BoxedUint ) > {
6666 let q = components. q ( ) ;
6767 let n = q. bits ( ) ;
68+ let q = q. widen ( n + 64 ) ;
69+ let q = & q;
6870
6971 // Attempt to try a fitting secret number
7072 // Give up after 4096 tries
7173 for _ in 0 ..4096 {
7274 let c = BoxedUint :: random_bits ( rng, n + 64 ) ;
73- let k = ( c % NonZero :: new ( & * * q - & BoxedUint :: one ( ) ) . unwrap ( ) ) + BoxedUint :: one ( ) ;
75+ let rem = NonZero :: new ( ( & * * q - & BoxedUint :: one ( ) ) . widen ( c. bits_precision ( ) ) ) . unwrap ( ) ;
76+ let k = ( c % rem) + BoxedUint :: one ( ) ;
7477
7578 if let Some ( inv_k) = k. inv_mod ( q) . into ( ) {
7679 // `k` and `k^-1` both have to be in the range `[1, q-1]`
Original file line number Diff line number Diff line change @@ -83,13 +83,19 @@ impl VerifyingKey {
8383 let u1 = ( & z * & w) % q;
8484 let u2 = r. mul_mod ( & w, q) ;
8585
86- let u1_params = BoxedMontyParams :: new ( Odd :: new ( u1) . unwrap ( ) ) ;
87- let u2_params = BoxedMontyParams :: new ( Odd :: new ( u2) . unwrap ( ) ) ;
88-
89- let g_form = BoxedMontyForm :: new ( ( * * g) . clone ( ) , u1_params) ;
90- let y_form = BoxedMontyForm :: new ( ( * * y) . clone ( ) , u2_params) ;
91-
92- let v = ( g_form. pow ( p) . retrieve ( ) * y_form. pow ( p) . retrieve ( ) % p) % q;
86+ let p1_params = BoxedMontyParams :: new ( Odd :: new ( p. as_ref ( ) . clone ( ) ) . unwrap ( ) ) ;
87+ let p2_params = BoxedMontyParams :: new ( Odd :: new ( p. as_ref ( ) . clone ( ) ) . unwrap ( ) ) ;
88+
89+ let g_form = BoxedMontyForm :: new ( ( * * g) . clone ( ) , p1_params) ;
90+ let y_form = BoxedMontyForm :: new ( ( * * y) . clone ( ) , p2_params) ;
91+
92+ let v1 = g_form. pow ( & u1) . retrieve ( ) ;
93+ let v2 = y_form. pow ( & u2) . retrieve ( ) ;
94+ let v3 = v1 * v2;
95+ let p = p. widen ( v3. bits_precision ( ) ) ;
96+ let q = q. widen ( v3. bits_precision ( ) ) ;
97+ let v4 = v3 % p;
98+ let v = v4 % q;
9399
94100 Some ( v == * * r)
95101 }
You can’t perform that action at this time.
0 commit comments