Skip to content

Commit 2926c91

Browse files
fix: do not panic on a prime being 1 when loading a secret key (#624)
Fixes GHSA-9c48-w39g-hm26
1 parent 488d2ad commit 2926c91

File tree

3 files changed

+20
-12
lines changed

3 files changed

+20
-12
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ readme = "README.md"
1313
rust-version = "1.65"
1414

1515
[dependencies]
16-
num-bigint = { version = "0.8.2", features = ["i128", "prime", "zeroize"], default-features = false, package = "num-bigint-dig" }
16+
num-bigint = { version = "0.8.6", features = ["i128", "prime", "zeroize"], default-features = false, package = "num-bigint-dig" }
1717
num-traits = { version= "0.2.9", default-features = false, features = ["libm"] }
1818
num-integer = { version = "0.1.39", default-features = false }
1919
rand_core = { version = "0.6.4", default-features = false }

src/key.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ impl RsaPrivateKey {
391391
let mut m = BigUint::one();
392392
for prime in &self.primes {
393393
// Any primes ≤ 1 will cause divide-by-zero panics later.
394-
if *prime < BigUint::one() {
394+
if *prime <= BigUint::one() {
395395
return Err(Error::InvalidPrime);
396396
}
397397
m *= prime;
@@ -538,7 +538,7 @@ mod tests {
538538
use crate::algorithms::rsa::{rsa_decrypt_and_check, rsa_encrypt};
539539

540540
use hex_literal::hex;
541-
use num_traits::{FromPrimitive, ToPrimitive};
541+
use num_traits::{FromPrimitive, ToPrimitive, Zero};
542542
use pkcs8::DecodePrivateKey;
543543
use rand_chacha::{rand_core::SeedableRng, ChaCha8Rng};
544544

@@ -841,4 +841,19 @@ mod tests {
841841

842842
assert_eq!(key.d(), ref_key.d());
843843
}
844+
845+
#[test]
846+
fn test_key_invalid_primes() {
847+
let e = RsaPrivateKey::from_components(
848+
BigUint::from_u64(239).unwrap(),
849+
BigUint::from_u64(185).unwrap(),
850+
BigUint::zero(),
851+
vec![
852+
BigUint::from_u64(1).unwrap(),
853+
BigUint::from_u64(239).unwrap(),
854+
],
855+
)
856+
.unwrap_err();
857+
assert_eq!(e, Error::InvalidPrime);
858+
}
844859
}

0 commit comments

Comments
 (0)