You need to sign in or sign up before continuing.
提交 e4676e90 编写于 作者: M Matt Caswell

Fix probable_prime over large shift

In the probable_prime() function we behave slightly different if the number
of bits we are interested in is <= BN_BITS2 (the num of bits in a BN_ULONG).
As part of the calculation we work out a size_limit as follows:

    size_limit = (((BN_ULONG)1) << bits) - BN_get_word(rnd) - 1;

There is a problem though if bits == BN_BITS2. Shifting by that much causes
undefined behaviour. I did some tests. On my system BN_BITS2 == 64. So I
set bits to 64 and calculated the result of:

    (((BN_ULONG)1) << bits)

I was expecting to get the result 0. I actually got 1! Strangely this...

    (((BN_ULONG)0) << BN_BITS2)

...does equal 0! This means that, on my system at least, size_limit will be
off by 1 when bits == BN_BITS2.

This commit fixes the behaviour so that we always get consistent results.
Reviewed-by: NAndy Polyakov <appro@openssl.org>
上级 3475c7a1
...@@ -518,7 +518,17 @@ static int probable_prime(BIGNUM *rnd, int bits) ...@@ -518,7 +518,17 @@ static int probable_prime(BIGNUM *rnd, int bits)
* additionally don't want to exceed that many bits. * additionally don't want to exceed that many bits.
*/ */
if (is_single_word) { if (is_single_word) {
BN_ULONG size_limit = (((BN_ULONG)1) << bits) - BN_get_word(rnd) - 1; BN_ULONG size_limit;
if (bits == BN_BITS2) {
/*
* Shifting by this much has undefined behaviour so we do it a
* different way
*/
size_limit = ~((BN_ULONG)0) - BN_get_word(rnd);
} else {
size_limit = (((BN_ULONG)1) << bits) - BN_get_word(rnd) - 1;
}
if (size_limit < maxdelta) if (size_limit < maxdelta)
maxdelta = size_limit; maxdelta = size_limit;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册