# bulk-gcd
[![Build Status](https://secure.travis-ci.org/indutny/bulk-gcd.svg)](http://travis-ci.org/indutny/bulk-gcd)
[![Latest version](https://img.shields.io/crates/v/bulk-gcd.svg)](https://crates.io/crates/bulk-gcd)
[![Documentation](https://docs.rs/bulk-gcd/badge.svg)](https://docs.rs/bulk-gcd)
![License](https://img.shields.io/crates/l/bulk-gcd.svg)
This package provides and implementation of bulk GCD (Greatest Common Divisor)
algorithm by [D. Bernstein][bernstein].
## Why?
GCD is useful for identifying weak keys in a large set of RSA keys. Such
sets were collected by researches (e.g. [this paper][that paper]). In order to
find weak keys a pairwise GCD has to be executed on all RSA moduli (i.e.
products of two primes `P` and `Q`, pertaining to each RSA private key).
However, each separate GCD computation takes considerable amount of time and the
naive pairwise process doesn't scale well (`O(n^2)`).
Instead of doing this search in a brute-force way, this module employs clever
algorithm by [D. Bernstein][bernstein], that finds GCD of each moduli with a
product of all other moduli. Through introduction of product and remainder
trees, the computational cost becomes logarithmic instead of quadratic, which
results in dramatic drop of the execution time.
## Quick example
```rust
extern crate bulk_gcd;
extern crate rug;
use rug::Integer;
let moduli = [
Integer::from(15),
Integer::from(35),
Integer::from(23),
];
let result = bulk_gcd::compute(&moduli).unwrap();
assert_eq!(result, vec![
Some(Integer::from(5)),
Some(Integer::from(5)),
None,
]);
```
## Using bulk-gcd
`bulk-gcd` is available on [crates.io][crates]. To use `bulk-gcd` in your crate,
add it as a dependency inside [Cargo.toml][cargo doc]:
```
[dependencies]
bulk-gcd = "^1.0.0"
```
You also need to declare it by adding this to your crate root (usually
`lib.rs` or `main.rs`):
```rust
extern crate bulk_gcd;
```
## Credits
Huge thanks to [Michael Grunder][1] for helping me make threads work in Rust.
[bernstein]: https://cr.yp.to/factorization/smoothparts-20040510.pdf
[that paper]: https://factorable.net/weakkeys12.conference.pdf
[crates]: https://crates.io/crates/bulk-gcd
[cargo doc]: https://doc.rust-lang.org/cargo/guide/dependencies.html
[1]: https://github.com/michael-grunder