Fix BN_mod_word bug.
On systems where we do not have BN_ULLONG (notably Win64), BN_mod_word() can return incorrect results if the supplied modulus is too big. (Imported from upstream's e82fd1b4574c8908b2c3bb68e1237f057a981820 and e4c4b2766bb97b34ea3479252276ab7c66311809.) Change-Id: Icee8a7c5c67a8ee14c276097f43a7c491e68c2f9 Reviewed-on: https://boringssl-review.googlesource.com/8233 Reviewed-by: Adam Langley <agl@google.com>
This commit is contained in:
parent
8f1e113a73
commit
67cb49d045
@ -850,11 +850,17 @@ static bool test_div_word(FILE *fp) {
|
||||
return false;
|
||||
}
|
||||
BN_ULONG s = b->d[0];
|
||||
BN_ULONG rmod = BN_mod_word(b.get(), s);
|
||||
BN_ULONG r = BN_div_word(b.get(), s);
|
||||
if (r == (BN_ULONG)-1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (rmod != r) {
|
||||
fprintf(stderr, "Mod (word) test failed!\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (fp != NULL) {
|
||||
BN_print_fp(fp, a.get());
|
||||
puts_fp(fp, " / ");
|
||||
|
@ -644,6 +644,20 @@ BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w) {
|
||||
return (BN_ULONG) -1;
|
||||
}
|
||||
|
||||
#ifndef BN_ULLONG
|
||||
/* If |w| is too long and we don't have |BN_ULLONG| then we need to fall back
|
||||
* to using |BN_div_word|. */
|
||||
if (w > ((BN_ULONG)1 << BN_BITS4)) {
|
||||
BIGNUM *tmp = BN_dup(a);
|
||||
if (tmp == NULL) {
|
||||
return (BN_ULONG)-1;
|
||||
}
|
||||
ret = BN_div_word(tmp, w);
|
||||
BN_free(tmp);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
w &= BN_MASK2;
|
||||
for (i = a->top - 1; i >= 0; i--) {
|
||||
#ifndef BN_ULLONG
|
||||
|
Loading…
Reference in New Issue
Block a user