Refactor BN_R_NO_INVERSE logic in internal functions
authorNicola Tuveri <nic.tuv@gmail.com>
Sat, 13 Jun 2020 14:29:09 +0000 (17:29 +0300)
committerNicola Tuveri <nic.tuv@gmail.com>
Tue, 16 Jun 2020 18:41:33 +0000 (21:41 +0300)
commit5d8b3a3ef2941b8822523742a0408ca6896aa65d
tree74e1f4901938f8ef5f6b6d03a2e84151266910ed
parente98c7350bfaf0ae1f2b72d68d4c5721de24a478f
Refactor BN_R_NO_INVERSE logic in internal functions

Closes #12129

As described in https://github.com/openssl/openssl/issues/12129 the
readability of the internal functions providing the two alternative
implementations for `BN_mod_inverse()` is a bit lacking.

Both these functions are now completely internal, so we have the
flexibility needed to slightly improve readability and remove
unnecessary NULL checks.

The main changes here are:
- rename `BN_mod_inverse_no_branch()` as `bn_mod_inverse_no_branch()`:
  this function is `static` so it is not even visible within the rest of
  libcrypto. By convention upcase prefixes are reserved for public
  functions.
- remove `if (pnoinv == NULL)` checks in `int_bn_mod_inverse()`: this
  function is internal to the BN module and we can guarantee that all
  callers pass non-NULL arguments.
- `bn_mod_inverse_no_branch()` takes an extra `int *pnoinv` argument, so
  that it can signal if no inverse exists for the given inputs: in this
  way the caller is in charge of raising `BN_R_NO_INVERSE` as it is the
  case for the non-consttime implementation of `int_bn_mod_inverse()`.
- `BN_mod_inverse()` is a public function and must guarantee that the
  internal functions providing the actual implementation receive valid
  arguments. If the caller passes a NULL `BN_CTX` we create a temporary
  one for internal use.
- reorder function definitions in `crypto/bn/bn_gcd.c` to avoid forward
  declaration of `static` functions (in preparation for inlining).
- inline `bn_mod_inverse_no_branch()`.

Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org>
(Merged from https://github.com/openssl/openssl/pull/12142)
crypto/bn/bn_gcd.c
crypto/err/openssl.txt
include/openssl/bn.h
include/openssl/bnerr.h