Fix BN_is_prime* calls. This function returns a tri-state -1 on error. We should check this. Change-Id: I6fe130c11d10690923aac5ac7a6dfe3e3ff3f5e9 Reviewed-on: https://boringssl-review.googlesource.com/8490 Reviewed-by: Adam Langley <agl@google.com>
diff --git a/crypto/dh/check.c b/crypto/dh/check.c index d27fdf1..fbe58a5 100644 --- a/crypto/dh/check.c +++ b/crypto/dh/check.c
@@ -120,7 +120,7 @@ * for 5, p mod 10 == 3 or 7 * should hold. */ - int ok = 0; + int ok = 0, r; BN_CTX *ctx = NULL; BN_ULONG l; BIGNUM *t1 = NULL, *t2 = NULL; @@ -154,7 +154,11 @@ *ret |= DH_CHECK_NOT_SUITABLE_GENERATOR; } } - if (!BN_is_prime_ex(dh->q, BN_prime_checks, ctx, NULL)) { + r = BN_is_prime_ex(dh->q, BN_prime_checks, ctx, NULL); + if (r < 0) { + goto err; + } + if (!r) { *ret |= DH_CHECK_Q_NOT_PRIME; } /* Check p == 1 mod q i.e. q divides p - 1 */ @@ -181,13 +185,21 @@ *ret |= DH_CHECK_UNABLE_TO_CHECK_GENERATOR; } - if (!BN_is_prime_ex(dh->p, BN_prime_checks, ctx, NULL)) { + r = BN_is_prime_ex(dh->p, BN_prime_checks, ctx, NULL); + if (r < 0) { + goto err; + } + if (!r) { *ret |= DH_CHECK_P_NOT_PRIME; } else if (!dh->q) { if (!BN_rshift1(t1, dh->p)) { goto err; } - if (!BN_is_prime_ex(t1, BN_prime_checks, ctx, NULL)) { + r = BN_is_prime_ex(t1, BN_prime_checks, ctx, NULL); + if (r < 0) { + goto err; + } + if (!r) { *ret |= DH_CHECK_P_NOT_SAFE_PRIME; } }