Skip to content

Commit fde178e

Browse files
committed
fixup keypair gen
1 parent 78f43b3 commit fde178e

File tree

4 files changed

+23
-12
lines changed

4 files changed

+23
-12
lines changed

dsa/src/generate.rs

-2
Original file line numberDiff line numberDiff 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]
1717
fn 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

dsa/src/generate/components.rs

+6-2
Original file line numberDiff line numberDiff 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

dsa/src/generate/secret_number.rs

+4-1
Original file line numberDiff line numberDiff 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]`

dsa/src/verifying_key.rs

+13-7
Original file line numberDiff line numberDiff 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
}

0 commit comments

Comments
 (0)