2016-05-05 13:05:22 -04:00
|
|
|
#![feature(test)]
|
2015-10-04 21:32:25 -04:00
|
|
|
|
2015-10-06 23:12:26 -04:00
|
|
|
/// # The Pumpkin Prime Number Generator
|
|
|
|
///
|
|
|
|
/// The `pumpkin` prime number generator library can be used to generate
|
|
|
|
/// prime numbers of any reasonable length, suitable for any cryptographic
|
|
|
|
/// purpose. All numbers generated are seeded from the operating system's
|
|
|
|
/// secure source of entrophy and are verified using three different primality
|
|
|
|
/// tests.
|
|
|
|
///
|
2016-05-05 13:05:22 -04:00
|
|
|
/// Primes have to be AT LEAST 512-bits long. Any lower bit-length will
|
|
|
|
/// immediately fail.
|
|
|
|
///
|
2015-10-12 22:01:09 -04:00
|
|
|
/// ## Examples
|
2015-10-06 23:12:26 -04:00
|
|
|
///
|
|
|
|
/// ```
|
2015-10-12 22:01:09 -04:00
|
|
|
/// extern crate pumpkin;
|
2015-10-06 23:12:26 -04:00
|
|
|
///
|
2015-10-12 22:01:09 -04:00
|
|
|
/// use pumpkin::Prime;
|
2015-10-06 23:12:26 -04:00
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// // Generate a 2048-bit prime number
|
2015-10-12 22:01:09 -04:00
|
|
|
/// let p = Prime::new(2048);
|
|
|
|
/// let q = Prime::new(2048);
|
2015-10-06 23:12:26 -04:00
|
|
|
///
|
2015-10-12 22:01:09 -04:00
|
|
|
/// let r = p * q;
|
|
|
|
/// println!("{}", r); // Some ridiculously large number
|
2015-10-06 23:12:26 -04:00
|
|
|
/// }
|
|
|
|
/// ```
|
|
|
|
|
2015-10-08 00:49:01 -04:00
|
|
|
#[macro_use] extern crate custom_derive;
|
|
|
|
#[macro_use] extern crate newtype_derive;
|
2015-10-04 21:32:25 -04:00
|
|
|
extern crate ramp;
|
2015-09-28 00:25:30 -04:00
|
|
|
extern crate rand;
|
2016-05-05 13:05:22 -04:00
|
|
|
extern crate test;
|
2015-09-28 00:25:30 -04:00
|
|
|
|
2015-10-12 22:01:09 -04:00
|
|
|
mod prime;
|
|
|
|
pub use prime::Prime;
|
2016-05-05 13:05:22 -04:00
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
use rand::OsRng;
|
|
|
|
use super::*;
|
|
|
|
use test::Bencher;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
#[should_panic]
|
|
|
|
fn test_new_small_prime() {
|
|
|
|
Prime::new(511);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
#[should_panic]
|
|
|
|
fn test_new_small_prime_from_rng() {
|
|
|
|
let mut rngesus = match OsRng::new() {
|
|
|
|
Ok(rng) => rng,
|
|
|
|
Err(reason) => panic!("An error occurred when initializing the RNG: {}", reason)
|
|
|
|
};
|
|
|
|
|
|
|
|
Prime::from_rng(511, &mut rngesus);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
|
|
|
#[ignore]
|
|
|
|
fn bench_generate_512_bit_prime(b: &mut Bencher) {
|
|
|
|
b.iter(|| Prime::new(512));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
|
|
|
#[ignore]
|
|
|
|
fn bench_generate_1024_bit_prime(b: &mut Bencher) {
|
|
|
|
b.iter(|| Prime::new(1024));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
|
|
|
#[ignore]
|
|
|
|
fn bench_generate_2048_bit_prime(b: &mut Bencher) {
|
|
|
|
b.iter(|| Prime::new(2048));
|
|
|
|
}
|
|
|
|
}
|