## Invalid Jacobian coordinates used for the point at infinity

### Description

The functions `ShamirMultJacobian`

and `_preComputeJacobianPoints`

use `(0, 0, 0)`

with the intention to represent the point at infinity in Jacobian coordinates. However, this is not a valid point in Jacobian coordinates. The point at infinity is represented in Jacobian coordinates with `(c^2, c^3, 0)`

, with `0 < c < p`

and exponentiation done modulo `p`

.

### Impact

As `_affineFromJacobian`

and `_jAdd`

check for an argument being the point at infinity by only comparing the last component with 0, they work as intended anyway. The function `_modifiedJacobianDouble`

will return `(0,0,0)`

if passed `(0,0,0)`

. Results are thus currently correct if `(0, 0, 0)`

is treated as an alias for the point at infinity.

### Recommendations

Consider changing `(0,0,0)`

to `(1,1,0)`

in the two places; or, if it is preferred to keep `(0,0,0)`

as an efficiency trick to save gas, document that this is intentional and that functions such as `_jAdd`

, `_modifiedJacobianDouble`

, and `_affineFromJacobian`

must treat `(0,0,0)`

as the point at infinity. In the latter case, we recommend adding test cases for this as well.

### Remediation

This issue has been acknowledged by Biconomy Labs, and fixes were implemented in the following commits: