1
1
use crypto_bigint:: { Integer , Odd , RandomBits , RandomMod , Word } ;
2
2
use rand_core:: CryptoRng ;
3
3
4
- #[ cfg( feature = "default-rng" ) ]
5
- use rand_core:: { OsRng , TryRngCore } ;
6
-
7
4
use crate :: {
8
5
generic:: sieve_and_find,
9
6
hazmat:: {
@@ -14,52 +11,6 @@ use crate::{
14
11
#[ cfg( feature = "multicore" ) ]
15
12
use crate :: generic:: par_sieve_and_find;
16
13
17
- /// Returns a random prime of size `bit_length` using [`OsRng`] as the RNG.
18
- ///
19
- /// See [`is_prime`] for details about the performed checks.
20
- #[ cfg( feature = "default-rng" ) ]
21
- pub fn generate_prime < T : Integer + RandomBits + RandomMod > ( bit_length : u32 ) -> T {
22
- generate_prime_with_rng ( & mut OsRng . unwrap_err ( ) , bit_length)
23
- }
24
-
25
- /// Returns a random prime of size `bit_length` using [`OsRng`] as the RNG.
26
- ///
27
- /// See [`is_prime`] for details about the performed checks.
28
- ///
29
- /// Uses `threadcount` cores to parallelize the prime search.
30
- ///
31
- /// Panics if `bit_length` is less than 2, or greater than the bit size of the target `Uint`.
32
- ///
33
- /// Panics if the platform is unable to spawn threads.
34
- #[ cfg( all( feature = "default-rng" , feature = "multicore" ) ) ]
35
- pub fn par_generate_prime < T : Integer + RandomBits + RandomMod > ( bit_length : u32 , threadcount : usize ) -> T {
36
- par_generate_prime_with_rng ( & mut OsRng . unwrap_err ( ) , bit_length, threadcount)
37
- }
38
-
39
- /// Returns a random safe prime (that is, such that `(n - 1) / 2` is also prime) of size
40
- /// `bit_length` using [`OsRng`] as the RNG.
41
- ///
42
- /// See [`is_prime`] for details about the performed checks.
43
- #[ cfg( feature = "default-rng" ) ]
44
- pub fn generate_safe_prime < T : Integer + RandomBits + RandomMod > ( bit_length : u32 ) -> T {
45
- generate_safe_prime_with_rng ( & mut OsRng . unwrap_err ( ) , bit_length)
46
- }
47
-
48
- /// Returns a random safe prime (that is, such that `(n - 1) / 2` is also prime) of size
49
- /// `bit_length` using [`OsRng`] as the RNG.
50
- ///
51
- /// See [`is_prime`] for details about the performed checks.
52
- ///
53
- /// Uses `threadcount` cores to parallelize the prime search.
54
- ///
55
- /// Panics if `bit_length` is less than 3, or greater than the bit size of the target `Uint`.
56
- ///
57
- /// Panics if the platform is unable to spawn threads.
58
- #[ cfg( all( feature = "default-rng" , feature = "multicore" ) ) ]
59
- pub fn par_generate_safe_prime < T : Integer + RandomBits + RandomMod > ( bit_length : u32 , threadcount : usize ) -> T {
60
- par_generate_safe_prime_with_rng ( & mut OsRng . unwrap_err ( ) , bit_length, threadcount)
61
- }
62
-
63
14
/// Returns a random prime of size `bit_length` using the provided RNG.
64
15
///
65
16
/// Panics if `bit_length` is less than 2, or greater than the bit size of the target `Uint`.
@@ -306,8 +257,8 @@ mod tests {
306
257
use rand_core:: { OsRng , TryRngCore } ;
307
258
308
259
use super :: {
309
- fips_is_prime_with_rng, fips_is_safe_prime_with_rng, generate_prime , generate_prime_with_rng ,
310
- generate_safe_prime , generate_safe_prime_with_rng , is_prime, is_safe_prime,
260
+ fips_is_prime_with_rng, fips_is_safe_prime_with_rng, generate_prime_with_rng , generate_safe_prime_with_rng ,
261
+ is_prime, is_safe_prime,
311
262
} ;
312
263
use crate :: hazmat:: { minimum_mr_iterations, primes, pseudoprimes} ;
313
264
@@ -396,7 +347,7 @@ mod tests {
396
347
#[ test]
397
348
fn prime_generation ( ) {
398
349
for bit_length in ( 28 ..=128 ) . step_by ( 10 ) {
399
- let p: U128 = generate_prime ( bit_length) ;
350
+ let p: U128 = generate_prime_with_rng ( & mut OsRng . unwrap_mut ( ) , bit_length) ;
400
351
assert ! ( p. bits_vartime( ) == bit_length) ;
401
352
assert ! ( is_prime( & p) ) ;
402
353
assert ! ( fips_is_prime( & p) ) ;
@@ -406,7 +357,7 @@ mod tests {
406
357
#[ test]
407
358
fn prime_generation_boxed ( ) {
408
359
for bit_length in ( 28 ..=128 ) . step_by ( 10 ) {
409
- let p: BoxedUint = generate_prime ( bit_length) ;
360
+ let p: BoxedUint = generate_prime_with_rng ( & mut OsRng . unwrap_mut ( ) , bit_length) ;
410
361
assert ! ( p. bits_vartime( ) == bit_length) ;
411
362
assert ! ( p. to_words( ) . len( ) == nlimbs!( bit_length) ) ;
412
363
assert ! ( is_prime( & p) ) ;
@@ -417,7 +368,7 @@ mod tests {
417
368
#[ test]
418
369
fn safe_prime_generation ( ) {
419
370
for bit_length in ( 28 ..=128 ) . step_by ( 10 ) {
420
- let p: U128 = generate_safe_prime ( bit_length) ;
371
+ let p: U128 = generate_safe_prime_with_rng ( & mut OsRng . unwrap_mut ( ) , bit_length) ;
421
372
assert ! ( p. bits_vartime( ) == bit_length) ;
422
373
assert ! ( is_safe_prime( & p) ) ;
423
374
assert ! ( fips_is_safe_prime( & p) ) ;
@@ -427,7 +378,7 @@ mod tests {
427
378
#[ test]
428
379
fn safe_prime_generation_boxed ( ) {
429
380
for bit_length in ( 28 ..=189 ) . step_by ( 10 ) {
430
- let p: BoxedUint = generate_safe_prime ( bit_length) ;
381
+ let p: BoxedUint = generate_safe_prime_with_rng ( & mut OsRng . unwrap_mut ( ) , bit_length) ;
431
382
assert ! ( p. bits_vartime( ) == bit_length) ;
432
383
assert ! ( p. to_words( ) . len( ) == nlimbs!( bit_length) ) ;
433
384
assert ! ( is_safe_prime( & p) ) ;
@@ -499,7 +450,7 @@ mod tests {
499
450
fn corner_cases_generate_prime ( ) {
500
451
for bits in 2 ..5 {
501
452
for _ in 0 ..100 {
502
- let p: U64 = generate_prime ( bits) ;
453
+ let p: U64 = generate_prime_with_rng ( & mut OsRng . unwrap_mut ( ) , bits) ;
503
454
let p_word = p. as_words ( ) [ 0 ] ;
504
455
assert ! ( is_prime_ref( p_word) ) ;
505
456
}
@@ -510,7 +461,7 @@ mod tests {
510
461
fn corner_cases_generate_safe_prime ( ) {
511
462
for bits in 3 ..5 {
512
463
for _ in 0 ..100 {
513
- let p: U64 = generate_safe_prime ( bits) ;
464
+ let p: U64 = generate_safe_prime_with_rng ( & mut OsRng . unwrap_mut ( ) , bits) ;
514
465
let p_word = p. as_words ( ) [ 0 ] ;
515
466
assert ! ( is_prime_ref( p_word) && is_prime_ref( p_word / 2 ) ) ;
516
467
}
@@ -520,13 +471,15 @@ mod tests {
520
471
521
472
#[ cfg( all( test, feature = "multicore" ) ) ]
522
473
mod multicore_tests {
523
- use super :: { is_prime, par_generate_prime, par_generate_safe_prime} ;
474
+ use rand_core:: { OsRng , TryRngCore } ;
475
+
476
+ use super :: { is_prime, par_generate_prime_with_rng, par_generate_safe_prime_with_rng} ;
524
477
use crypto_bigint:: { nlimbs, BoxedUint , U128 } ;
525
478
526
479
#[ test]
527
480
fn parallel_prime_generation ( ) {
528
481
for bit_length in ( 28 ..=128 ) . step_by ( 10 ) {
529
- let p: U128 = par_generate_prime ( bit_length, 4 ) ;
482
+ let p: U128 = par_generate_prime_with_rng ( & mut OsRng . unwrap_err ( ) , bit_length, 4 ) ;
530
483
assert ! ( p. bits_vartime( ) == bit_length) ;
531
484
assert ! ( is_prime( & p) ) ;
532
485
}
@@ -535,7 +488,7 @@ mod multicore_tests {
535
488
#[ test]
536
489
fn parallel_prime_generation_boxed ( ) {
537
490
for bit_length in ( 28 ..=128 ) . step_by ( 10 ) {
538
- let p: BoxedUint = par_generate_prime ( bit_length, 2 ) ;
491
+ let p: BoxedUint = par_generate_prime_with_rng ( & mut OsRng . unwrap_err ( ) , bit_length, 2 ) ;
539
492
assert ! ( p. bits_vartime( ) == bit_length) ;
540
493
assert ! ( p. to_words( ) . len( ) == nlimbs!( bit_length) ) ;
541
494
assert ! ( is_prime( & p) ) ;
@@ -545,7 +498,7 @@ mod multicore_tests {
545
498
#[ test]
546
499
fn parallel_safe_prime_generation ( ) {
547
500
for bit_length in ( 28 ..=128 ) . step_by ( 10 ) {
548
- let p: U128 = par_generate_safe_prime ( bit_length, 8 ) ;
501
+ let p: U128 = par_generate_safe_prime_with_rng ( & mut OsRng . unwrap_err ( ) , bit_length, 8 ) ;
549
502
assert ! ( p. bits_vartime( ) == bit_length) ;
550
503
assert ! ( is_prime( & p) ) ;
551
504
}
@@ -554,7 +507,7 @@ mod multicore_tests {
554
507
#[ test]
555
508
fn parallel_safe_prime_generation_boxed ( ) {
556
509
for bit_length in ( 28 ..=128 ) . step_by ( 10 ) {
557
- let p: BoxedUint = par_generate_safe_prime ( bit_length, 4 ) ;
510
+ let p: BoxedUint = par_generate_safe_prime_with_rng ( & mut OsRng . unwrap_err ( ) , bit_length, 4 ) ;
558
511
assert ! ( p. bits_vartime( ) == bit_length) ;
559
512
assert ! ( p. to_words( ) . len( ) == nlimbs!( bit_length) ) ;
560
513
assert ! ( is_prime( & p) ) ;
@@ -572,7 +525,7 @@ mod tests_openssl {
572
525
use openssl:: bn:: { BigNum , BigNumContext } ;
573
526
use rand_core:: { OsRng , TryRngCore } ;
574
527
575
- use super :: { fips_is_prime_with_rng, generate_prime , is_prime} ;
528
+ use super :: { fips_is_prime_with_rng, generate_prime_with_rng , is_prime} ;
576
529
use crate :: hazmat:: { minimum_mr_iterations, random_odd_integer, SetBits } ;
577
530
578
531
fn openssl_is_prime ( num : & BigNum , ctx : & mut BigNumContext ) -> bool {
@@ -593,7 +546,7 @@ mod tests_openssl {
593
546
594
547
// Generate primes, let OpenSSL check them
595
548
for _ in 0 ..100 {
596
- let p: U128 = generate_prime ( 128 ) ;
549
+ let p: U128 = generate_prime_with_rng ( & mut OsRng . unwrap_mut ( ) , 128 ) ;
597
550
let p_bn = to_openssl ( & p) ;
598
551
assert ! ( openssl_is_prime( & p_bn, & mut ctx) , "OpenSSL reports {p} as composite" , ) ;
599
552
}
@@ -645,7 +598,7 @@ mod tests_gmp {
645
598
Integer ,
646
599
} ;
647
600
648
- use super :: { fips_is_prime_with_rng, generate_prime , is_prime} ;
601
+ use super :: { fips_is_prime_with_rng, generate_prime_with_rng , is_prime} ;
649
602
use crate :: hazmat:: { minimum_mr_iterations, random_odd_integer, SetBits } ;
650
603
651
604
fn gmp_is_prime ( num : & Integer ) -> bool {
@@ -664,7 +617,7 @@ mod tests_gmp {
664
617
fn gmp_cross_check ( ) {
665
618
// Generate primes, let GMP check them
666
619
for _ in 0 ..100 {
667
- let p: U128 = generate_prime ( 128 ) ;
620
+ let p: U128 = generate_prime_with_rng ( & mut OsRng . unwrap_mut ( ) , 128 ) ;
668
621
let p_bn = to_gmp ( & p) ;
669
622
assert ! ( gmp_is_prime( & p_bn) , "GMP reports {p} as composite" ) ;
670
623
}
0 commit comments