Skip to content

Commit a5b6804

Browse files
committed
fixup keypair gen
1 parent 79c61dc commit a5b6804

File tree

4 files changed

+26
-11
lines changed

4 files changed

+26
-11
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

+16-6
Original file line numberDiff line numberDiff line change
@@ -67,25 +67,35 @@ impl VerifyingKey {
6767
if signature.r() >= q || signature.s() >= q {
6868
return Some(false);
6969
}
70+
let q = q.widen(s.bits_precision());
71+
let q = &q;
7072

71-
let w = Option::from(s.inv_mod(q))?;
73+
let w: BoxedUint = Option::from(s.inv_mod(q))?;
7274

7375
let n = q.bits() / 8;
7476
let block_size = hash.len(); // Hash function output size
7577

7678
let z_len = min(n as usize, block_size);
7779
let z = BoxedUint::from_be_slice(&hash[..z_len], z_len as u32 * 8).unwrap();
7880

81+
let z = z.widen(q.bits_precision());
82+
7983
let u1 = (&z * &w) % q;
8084
let u2 = r.mul_mod(&w, q);
8185

82-
let u1_params = BoxedMontyParams::new(Odd::new(u1).unwrap());
83-
let u2_params = BoxedMontyParams::new(Odd::new(u2).unwrap());
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());
8488

85-
let g_form = BoxedMontyForm::new((**g).clone(), u1_params);
86-
let y_form = BoxedMontyForm::new((**y).clone(), u2_params);
89+
let g_form = BoxedMontyForm::new((**g).clone(), p1_params);
90+
let y_form = BoxedMontyForm::new((**y).clone(), p2_params);
8791

88-
let v = (g_form.pow(p).retrieve() * y_form.pow(p).retrieve() % p) % q;
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;
8999

90100
Some(v == **r)
91101
}

0 commit comments

Comments
 (0)