Skip to content

Commit d8a30e3

Browse files
committed
progress
1 parent fedfe87 commit d8a30e3

File tree

13 files changed

+269
-248
lines changed

13 files changed

+269
-248
lines changed

Cargo.lock

Lines changed: 27 additions & 75 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dsa/Cargo.toml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,16 @@ rust-version = "1.65"
1616

1717
[dependencies]
1818
digest = "0.10"
19-
num-bigint = { package = "num-bigint-dig", version = "0.8", default-features = false, features = ["prime", "rand", "zeroize"] }
20-
num-traits = { version = "0.2", default-features = false }
19+
crypto-bigint = { version = "0.6.0-pre.7", features = ["alloc", "zeroize"] }
20+
crypto-primes = "0.6.0-pre.0"
2121
pkcs8 = { version = "0.10", default-features = false, features = ["alloc"] }
2222
rfc6979 = { version = "0.4", path = "../rfc6979" }
2323
sha2 = { version = "0.10", default-features = false }
24-
signature = { version = "2.0, <2.3", default-features = false, features = ["alloc", "digest", "rand_core"] }
24+
signature = { version = "2.0, <2.3", default-features = false, features = [
25+
"alloc",
26+
"digest",
27+
"rand_core",
28+
] }
2529
zeroize = { version = "1", default-features = false }
2630

2731
[dev-dependencies]

dsa/src/components.rs

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
//!
44
55
use crate::{size::KeySize, two};
6-
use num_bigint::BigUint;
7-
use num_traits::Zero;
6+
use crypto_bigint::{BoxedUint, NonZero};
87
use pkcs8::der::{
98
self, asn1::UintRef, DecodeValue, Encode, EncodeValue, Header, Length, Reader, Sequence, Tag,
109
Writer,
@@ -18,19 +17,23 @@ use signature::rand_core::CryptoRngCore;
1817
#[must_use]
1918
pub struct Components {
2019
/// Prime p
21-
p: BigUint,
20+
p: NonZero<BoxedUint>,
2221

2322
/// Quotient q
24-
q: BigUint,
23+
q: NonZero<BoxedUint>,
2524

2625
/// Generator g
27-
g: BigUint,
26+
g: NonZero<BoxedUint>,
2827
}
2928

3029
impl Components {
3130
/// Construct the common components container from its inner values (p, q and g)
32-
pub fn from_components(p: BigUint, q: BigUint, g: BigUint) -> signature::Result<Self> {
33-
if p < two() || q < two() || g.is_zero() || g > p {
31+
pub fn from_components(
32+
p: NonZero<BoxedUint>,
33+
q: NonZero<BoxedUint>,
34+
g: NonZero<BoxedUint>,
35+
) -> signature::Result<Self> {
36+
if *p < two() || *q < two() || g > p {
3437
return Err(signature::Error::new());
3538
}
3639

@@ -45,19 +48,19 @@ impl Components {
4548

4649
/// DSA prime p
4750
#[must_use]
48-
pub const fn p(&self) -> &BigUint {
51+
pub const fn p(&self) -> &NonZero<BoxedUint> {
4952
&self.p
5053
}
5154

5255
/// DSA quotient q
5356
#[must_use]
54-
pub const fn q(&self) -> &BigUint {
57+
pub const fn q(&self) -> &NonZero<BoxedUint> {
5558
&self.q
5659
}
5760

5861
/// DSA generator g
5962
#[must_use]
60-
pub const fn g(&self) -> &BigUint {
63+
pub const fn g(&self) -> &NonZero<BoxedUint> {
6164
&self.g
6265
}
6366
}
@@ -68,25 +71,29 @@ impl<'a> DecodeValue<'a> for Components {
6871
let q = reader.decode::<UintRef<'_>>()?;
6972
let g = reader.decode::<UintRef<'_>>()?;
7073

71-
let p = BigUint::from_bytes_be(p.as_bytes());
72-
let q = BigUint::from_bytes_be(q.as_bytes());
73-
let g = BigUint::from_bytes_be(g.as_bytes());
74+
let p = BoxedUint::from_be_slice(p.as_bytes(), (p.as_bytes().len() * 8) as u32).unwrap();
75+
let q = BoxedUint::from_be_slice(q.as_bytes(), (q.as_bytes().len() * 8) as u32).unwrap();
76+
let g = BoxedUint::from_be_slice(g.as_bytes(), (g.as_bytes().len() * 8) as u32).unwrap();
77+
78+
let p = NonZero::new(p).unwrap();
79+
let q = NonZero::new(q).unwrap();
80+
let g = NonZero::new(g).unwrap();
7481

7582
Self::from_components(p, q, g).map_err(|_| Tag::Integer.value_error())
7683
}
7784
}
7885

7986
impl EncodeValue for Components {
8087
fn value_len(&self) -> der::Result<Length> {
81-
UintRef::new(&self.p.to_bytes_be())?.encoded_len()?
82-
+ UintRef::new(&self.q.to_bytes_be())?.encoded_len()?
83-
+ UintRef::new(&self.g.to_bytes_be())?.encoded_len()?
88+
UintRef::new(&self.p.to_be_bytes())?.encoded_len()?
89+
+ UintRef::new(&self.q.to_be_bytes())?.encoded_len()?
90+
+ UintRef::new(&self.g.to_be_bytes())?.encoded_len()?
8491
}
8592

8693
fn encode_value(&self, writer: &mut impl Writer) -> der::Result<()> {
87-
UintRef::new(&self.p.to_bytes_be())?.encode(writer)?;
88-
UintRef::new(&self.q.to_bytes_be())?.encode(writer)?;
89-
UintRef::new(&self.g.to_bytes_be())?.encode(writer)?;
94+
UintRef::new(&self.p.to_be_bytes())?.encode(writer)?;
95+
UintRef::new(&self.q.to_be_bytes())?.encode(writer)?;
96+
UintRef::new(&self.g.to_be_bytes())?.encode(writer)?;
9097
Ok(())
9198
}
9299
}

dsa/src/generate.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use crate::two;
2-
use num_bigint::{BigUint, RandPrime};
3-
use num_traits::Pow;
2+
use crypto_bigint::BoxedUint;
43
use signature::rand_core::CryptoRngCore;
54

65
mod components;
@@ -13,9 +12,9 @@ pub use self::secret_number::{secret_number, secret_number_rfc6979};
1312

1413
/// Calculate the upper and lower bounds for generating values like p or q
1514
#[inline]
16-
fn calculate_bounds(size: u32) -> (BigUint, BigUint) {
17-
let lower = two().pow(size - 1);
18-
let upper = two().pow(size);
15+
fn calculate_bounds(size: u32) -> (BoxedUint, BoxedUint) {
16+
let lower = two().shl(size - 1);
17+
let upper = two().shl(size);
1918

2019
(lower, upper)
2120
}
@@ -24,6 +23,6 @@ fn calculate_bounds(size: u32) -> (BigUint, BigUint) {
2423
///
2524
/// This wrapper function mainly exists to enforce the [`CryptoRng`](rand::CryptoRng) requirement (I might otherwise forget it)
2625
#[inline]
27-
fn generate_prime(bit_length: usize, rng: &mut impl CryptoRngCore) -> BigUint {
28-
rng.gen_prime(bit_length)
26+
fn generate_prime(bit_length: u32, rng: &mut impl CryptoRngCore) -> BoxedUint {
27+
crypto_primes::generate_prime_with_rng(rng, bit_length, bit_length)
2928
}

0 commit comments

Comments
 (0)