Add Miller-Rabin test for random bases to BPSW
authortb <tb@openbsd.org>
Wed, 10 May 2023 12:21:55 +0000 (12:21 +0000)
committertb <tb@openbsd.org>
Wed, 10 May 2023 12:21:55 +0000 (12:21 +0000)
commit4e5c7375c43b4b3d3a80e32347ab7b8fde8f55fe
tree8b188497d757adeb2ce2de06a6d29acb92bee6fe
parentc06845b1c3ca93e4e363133d3ad803fb7ba7a70b
Add Miller-Rabin test for random bases to BPSW

The behavior of the BPSW primality test for numbers > 2^64 is not very
well understood. While there is no known composite that passes the test,
there are heuristics that indicate that there are likely infinitely many.
Therefore it seems appropriate to harden the test. Having a settable
number of MR rounds before doing a version of BPSW is also the approach
taken by Go's primality check in math/big.

This adds a new implementation of the old MR test that runs before running
the strong Lucas test. I like to imagine that it's slightly cleaner code.
We're effectively at about twice the cost of what we had a year ago. In
addition, it adds some non-determinism in case there actually are false
positives for the BPSW test.

The implementation is straightforward. It could easily be tweaked to use
the additional gcds in the "enhanced" MR test of FIPS 186-5, but as long
as we are only going to throw away the additional info, that's not worth
much.

This is a first step towards incorporating some of the considerations in
"A performant misuse-resistant API for Primality Testing" by Massimo and
Paterson. Further work will happen in tree. In particular, there are plans
to crank the number of Miller-Rabin tests considerably so as to have a
guaranteed baseline. The manual will be updated shortly.

positive feedback beck
ok jsing
lib/libcrypto/bn/bn_bpsw.c
lib/libcrypto/bn/bn_local.h
lib/libcrypto/bn/bn_prime.c