Provide bn_umul_hilo().
authorjsing <jsing@openbsd.org>
Tue, 31 Jan 2023 05:48:39 +0000 (05:48 +0000)
committerjsing <jsing@openbsd.org>
Tue, 31 Jan 2023 05:48:39 +0000 (05:48 +0000)
commitb97356a2c12dde78d7cd92d8d562f85df97cedad
treeaccc6b258189bd311bb4557f9924eea4e47ed932
parent1c0ab957bfc712d3c5dc9e69f5ded44d02ccbd3c
Provide bn_umul_hilo().

The bignum code needs to be able to multiply two words, producing a
double word result. Some architectures do not have native support for
this, hence a pure C version is required. bn_umul_hilo() provides this
functionality.

There are currently two implementations, both of which are branch free.
The first uses bitwise operations for the carry, while the second uses
accumulators. The accumulator version uses fewer instructions, however
requires more variables/registers and seems to be slower, at least on
amd64/i386. The accumulator version may be faster on architectures that
have more registers available. Further testing can be performed and one
of the two implementations can be removed at a later date.

ok tb@
lib/libcrypto/bn/bn_internal.h [new file with mode: 0644]