In case of low-memory conditions, the computation for legendre symbol
can fail and return -2 as per documentation, but the check for that
was missed here. And this can can cause an infinite loop searching for
qr and qnr if the error repeats for each attempt.
Break the loop if calculation fails, we can leave retry to the callers
or user. This is similar to the way allocation and generation of a new
random number was handled in this loop.
Signed-off-by: Chaitanya Tata <Chaitanya.Tata@nordicsemi.no>
}
res = crypto_bignum_legendre(tmp, prime);
- if (res == 1 && !(*qr))
+ if (res == 1 && !(*qr)) {
*qr = tmp;
- else if (res == -1 && !(*qnr))
+ } else if (res == -1 && !(*qnr)) {
*qnr = tmp;
- else
+ } else {
crypto_bignum_deinit(tmp, 0);
+ if (res == -2)
+ break;
+ }
}
if (*qr && *qnr)