File tree 4 files changed +23
-12
lines changed
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;
15
15
/// Calculate the upper and lower bounds for generating values like p or q
16
16
#[ inline]
17
17
fn calculate_bounds ( size : u32 ) -> ( BoxedUint , BoxedUint ) {
18
- let lower = two ( ) . shl ( size - 1 ) ;
19
- let upper = two ( ) . shl ( size) ;
20
18
let lower = BoxedUint :: one ( ) . widen ( size + 1 ) . shl ( size - 1 ) ;
21
19
let upper = BoxedUint :: one ( ) . widen ( size + 1 ) . shl ( size) ;
22
20
Original file line number Diff line number Diff line change @@ -37,14 +37,15 @@ pub fn common(
37
37
for _ in 0 ..4096 {
38
38
let m = ' gen_m: loop {
39
39
let m = BoxedUint :: random_bits ( rng, l) ;
40
+
40
41
if m > p_min && m < p_max {
41
42
break ' gen_m m;
42
43
}
43
44
} ;
44
45
let rem = NonZero :: new ( ( two ( ) * & * q) . widen ( m. bits_precision ( ) ) ) . unwrap ( ) ;
46
+
45
47
let mr = & m % & rem;
46
48
let p = m - mr + BoxedUint :: one ( ) ;
47
- let p = p. shorten ( q. bits_precision ( ) ) ;
48
49
let p = NonZero :: new ( p) . unwrap ( ) ;
49
50
50
51
if crypto_primes:: is_prime_with_rng ( rng, & * p) {
@@ -53,9 +54,10 @@ pub fn common(
53
54
}
54
55
} ;
55
56
57
+ let q = q. widen ( l) ;
58
+
56
59
// Generate g using the unverifiable method as defined by Appendix A.2.1
57
60
let e = ( & * p - & BoxedUint :: one ( ) ) / & q;
58
- let mut h = BoxedUint :: one ( ) ;
59
61
let mut h = BoxedUint :: one ( ) . widen ( q. bits_precision ( ) ) ;
60
62
let g = loop {
61
63
let params = BoxedMontyParams :: new_vartime ( Odd :: new ( ( * p) . clone ( ) ) . unwrap ( ) ) ;
@@ -69,6 +71,8 @@ pub fn common(
69
71
h = h + BoxedUint :: one ( ) ;
70
72
} ;
71
73
74
+ let q = NonZero :: new ( q. shorten ( n) ) . unwrap ( ) ;
75
+
72
76
( p, q, g)
73
77
}
74
78
Original file line number Diff line number Diff line change @@ -65,12 +65,15 @@ pub fn secret_number(
65
65
) -> Option < ( BoxedUint , BoxedUint ) > {
66
66
let q = components. q ( ) ;
67
67
let n = q. bits ( ) ;
68
+ let q = q. widen ( n + 64 ) ;
69
+ let q = & q;
68
70
69
71
// Attempt to try a fitting secret number
70
72
// Give up after 4096 tries
71
73
for _ in 0 ..4096 {
72
74
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 ( ) ;
74
77
75
78
if let Some ( inv_k) = k. inv_mod ( q) . into ( ) {
76
79
// `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 {
83
83
let u1 = ( & z * & w) % q;
84
84
let u2 = r. mul_mod ( & w, q) ;
85
85
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;
93
99
94
100
Some ( v == * * r)
95
101
}
You can’t perform that action at this time.
0 commit comments