Validity of modular subtraction in _jAdd
and _modifiedJacobianDouble
As the EVM does not have a submod
instruction, the functions _jAdd
and _modifiedJacobianDouble
use the following pattern several times.
assembly {
if lt(a, b) {
a := add(p, a)
}
let c := sub(a, b)
}
The assumption here is that and both satisfy , and the intention is to have c = (a - b) % p
. If , then holds, so plain subtraction can be used. In the case , it holds that , so is the value needed for .
We note that while the add
instruction could overflow (as is a 256-bit number), as both add
and sub
are calculated modulo , the end result for will still be correct.