@@ -9,19 +9,21 @@ use crate::hazmat::{
99} ;
1010
1111/// Returns a random prime of size `bit_length` using [`OsRng`] as the RNG.
12+ /// If `bit_length` is `None`, the full size of `Uint<L>` is used.
1213///
1314/// See [`is_prime_with_rng`] for details about the performed checks.
1415#[ cfg( feature = "default-rng" ) ]
15- pub fn prime < const L : usize > ( bit_length : usize ) -> Uint < L > {
16+ pub fn prime < const L : usize > ( bit_length : Option < usize > ) -> Uint < L > {
1617 prime_with_rng ( & mut OsRng , bit_length)
1718}
1819
1920/// Returns a random safe prime (that is, such that `(n - 1) / 2` is also prime)
2021/// of size `bit_length` using [`OsRng`] as the RNG.
22+ /// If `bit_length` is `None`, the full size of `Uint<L>` is used.
2123///
2224/// See [`is_prime_with_rng`] for details about the performed checks.
2325#[ cfg( feature = "default-rng" ) ]
24- pub fn safe_prime < const L : usize > ( bit_length : usize ) -> Uint < L > {
26+ pub fn safe_prime < const L : usize > ( bit_length : Option < usize > ) -> Uint < L > {
2527 safe_prime_with_rng ( & mut OsRng , bit_length)
2628}
2729
@@ -44,11 +46,16 @@ pub fn is_safe_prime<const L: usize>(num: &Uint<L>) -> bool {
4446}
4547
4648/// Returns a random prime of size `bit_length` using the provided RNG.
49+ /// If `bit_length` is `None`, the full size of `Uint<L>` is used.
4750///
4851/// Panics if `bit_length` is less than 2, or greater than the bit size of the target `Uint`.
4952///
5053/// See [`is_prime_with_rng`] for details about the performed checks.
51- pub fn prime_with_rng < const L : usize > ( rng : & mut impl CryptoRngCore , bit_length : usize ) -> Uint < L > {
54+ pub fn prime_with_rng < const L : usize > (
55+ rng : & mut impl CryptoRngCore ,
56+ bit_length : Option < usize > ,
57+ ) -> Uint < L > {
58+ let bit_length = bit_length. unwrap_or ( Uint :: < L > :: BITS ) ;
5259 if bit_length < 2 {
5360 panic ! ( "`bit_length` must be 2 or greater." ) ;
5461 }
@@ -65,14 +72,16 @@ pub fn prime_with_rng<const L: usize>(rng: &mut impl CryptoRngCore, bit_length:
6572
6673/// Returns a random safe prime (that is, such that `(n - 1) / 2` is also prime)
6774/// of size `bit_length` using the provided RNG.
75+ /// If `bit_length` is `None`, the full size of `Uint<L>` is used.
6876///
6977/// Panics if `bit_length` is less than 3, or is greater than the bit size of the target `Uint`.
7078///
7179/// See [`is_prime_with_rng`] for details about the performed checks.
7280pub fn safe_prime_with_rng < const L : usize > (
7381 rng : & mut impl CryptoRngCore ,
74- bit_length : usize ,
82+ bit_length : Option < usize > ,
7583) -> Uint < L > {
84+ let bit_length = bit_length. unwrap_or ( Uint :: < L > :: BITS ) ;
7685 if bit_length < 3 {
7786 panic ! ( "`bit_length` must be 3 or greater." ) ;
7887 }
@@ -240,7 +249,7 @@ mod tests {
240249 #[ test]
241250 fn generate_prime ( ) {
242251 for bit_length in ( 28 ..=128 ) . step_by ( 10 ) {
243- let p: U128 = prime ( bit_length) ;
252+ let p: U128 = prime ( Some ( bit_length) ) ;
244253 assert ! ( p. bits_vartime( ) == bit_length) ;
245254 assert ! ( is_prime( & p) ) ;
246255 }
@@ -249,7 +258,7 @@ mod tests {
249258 #[ test]
250259 fn generate_safe_prime ( ) {
251260 for bit_length in ( 28 ..=128 ) . step_by ( 10 ) {
252- let p: U128 = safe_prime ( bit_length) ;
261+ let p: U128 = safe_prime ( Some ( bit_length) ) ;
253262 assert ! ( p. bits_vartime( ) == bit_length) ;
254263 assert ! ( is_safe_prime( & p) ) ;
255264 }
@@ -282,25 +291,25 @@ mod tests {
282291 #[ test]
283292 #[ should_panic( expected = "`bit_length` must be 2 or greater" ) ]
284293 fn generate_prime_too_few_bits ( ) {
285- let _p: U64 = prime_with_rng ( & mut OsRng , 1 ) ;
294+ let _p: U64 = prime_with_rng ( & mut OsRng , Some ( 1 ) ) ;
286295 }
287296
288297 #[ test]
289298 #[ should_panic( expected = "`bit_length` must be 3 or greater" ) ]
290299 fn generate_safe_prime_too_few_bits ( ) {
291- let _p: U64 = safe_prime_with_rng ( & mut OsRng , 2 ) ;
300+ let _p: U64 = safe_prime_with_rng ( & mut OsRng , Some ( 2 ) ) ;
292301 }
293302
294303 #[ test]
295304 #[ should_panic( expected = "The requested bit length (65) is larger than the chosen Uint size" ) ]
296305 fn generate_prime_too_many_bits ( ) {
297- let _p: U64 = prime_with_rng ( & mut OsRng , 65 ) ;
306+ let _p: U64 = prime_with_rng ( & mut OsRng , Some ( 65 ) ) ;
298307 }
299308
300309 #[ test]
301310 #[ should_panic( expected = "The requested bit length (65) is larger than the chosen Uint size" ) ]
302311 fn generate_safe_prime_too_many_bits ( ) {
303- let _p: U64 = safe_prime_with_rng ( & mut OsRng , 65 ) ;
312+ let _p: U64 = safe_prime_with_rng ( & mut OsRng , Some ( 65 ) ) ;
304313 }
305314
306315 fn is_prime_ref ( num : Word ) -> bool {
@@ -311,7 +320,7 @@ mod tests {
311320 fn corner_cases_generate_prime ( ) {
312321 for bits in 2usize ..5 {
313322 for _ in 0 ..100 {
314- let p: U64 = prime ( bits) ;
323+ let p: U64 = prime ( Some ( bits) ) ;
315324 let p_word = p. as_words ( ) [ 0 ] ;
316325 assert ! ( is_prime_ref( p_word) ) ;
317326 }
@@ -322,7 +331,7 @@ mod tests {
322331 fn corner_cases_generate_safe_prime ( ) {
323332 for bits in 3usize ..5 {
324333 for _ in 0 ..100 {
325- let p: U64 = safe_prime ( bits) ;
334+ let p: U64 = safe_prime ( Some ( bits) ) ;
326335 let p_word = p. as_words ( ) [ 0 ] ;
327336 assert ! ( is_prime_ref( p_word) && is_prime_ref( p_word / 2 ) ) ;
328337 }
@@ -360,7 +369,7 @@ mod tests_openssl {
360369
361370 // Generate primes, let OpenSSL check them
362371 for _ in 0 ..100 {
363- let p: U128 = prime ( 128 ) ;
372+ let p: U128 = prime ( Some ( 128 ) ) ;
364373 let p_bn = to_openssl ( & p) ;
365374 assert ! (
366375 openssl_is_prime( & p_bn, & mut ctx) ,
@@ -419,7 +428,7 @@ mod tests_gmp {
419428 fn gmp_cross_check ( ) {
420429 // Generate primes, let GMP check them
421430 for _ in 0 ..100 {
422- let p: U128 = prime ( 128 ) ;
431+ let p: U128 = prime ( Some ( 128 ) ) ;
423432 let p_bn = to_gmp ( & p) ;
424433 assert ! ( gmp_is_prime( & p_bn) , "GMP reports {p} as composite" ) ;
425434 }
0 commit comments