This adds a SAGE script for verifying the implemented group laws.
The output should be:
Formula secp256k1_gej_add_var:
add_infinite_ab:
branch 0: OK
double:
branch 2: OK
add:
branch 4: OK
add_infinite_b:
branch 1: OK
add_infinite_a:
branch 0: OK
add_opposite:
branch 3: OK
Formula secp256k1_gej_add_ge_var:
add_infinite_ab:
branch 0: OK (assuming Bz - 1 = 0 [b.z=1])
double:
branch 2: OK (assuming Bz - 1 = 0 [b.z=1])
add:
branch 4: OK (assuming Bz - 1 = 0 [b.z=1])
add_infinite_b:
branch 1: OK (assuming Bz - 1 = 0 [b.z=1])
add_infinite_a:
branch 0: OK (assuming Bz - 1 = 0 [b.z=1])
add_opposite:
branch 3: OK (assuming Bz - 1 = 0 [b.z=1])
Formula secp256k1_gej_add_zinv_var:
add_infinite_ab:
branch 0: OK
double:
branch 2: OK
add:
branch 4: OK
add_infinite_b:
branch 0: OK
add_infinite_a:
branch 1: OK
add_opposite:
branch 3: OK
Formula secp256k1_gej_add_ge:
add_infinite_ab:
double:
branch 0: OK (assuming Bz - 1 = 0 [b.z=1], Bi = 0 [b_finite])
add:
branch 0: OK (assuming Bz - 1 = 0 [b.z=1], Bi = 0 [b_finite])
branch 2: OK (assuming Bz - 1 = 0 [b.z=1], Bi = 0 [b_finite])
branch 3: OK (assuming Bz - 1 = 0 [b.z=1], Bi = 0 [b_finite])
add_infinite_b:
add_infinite_a:
branch 4: OK (assuming Bz - 1 = 0 [b.z=1], Bi = 0 [b_finite])
branch 6: OK (assuming Bz - 1 = 0 [b.z=1], Bi = 0 [b_finite])
branch 7: OK (assuming Bz - 1 = 0 [b.z=1], Bi = 0 [b_finite])
branch 13: OK (assuming Bz - 1 = 0 [b.z=1], Bi = 0 [b_finite])
add_opposite:
branch 9: OK (assuming Bz - 1 = 0 [b.z=1], Bi = 0 [b_finite])
Formula secp256k1_gej_add_ge_old [should fail]:
add_infinite_ab:
double:
branch 0: OK (assuming Bz - 1 = 0 [b.z=1], Bi = 0 [b_finite])
add:
branch 0: OK (assuming Bz - 1 = 0 [b.z=1], Bi = 0 [b_finite])
branch 2: FAIL, ['on_curve', 'finite_point', 'colinear_2', 'colinear_1', 'colinear_3'] fails (assuming Bz - 1 = 0 [b.z=1], Bi = 0 [b_finite])
add_infinite_b:
add_infinite_a:
branch 1: OK (assuming Bz - 1 = 0 [b.z=1], Bi = 0 [b_finite])
add_opposite:
branch 2: OK (assuming Bz - 1 = 0 [b.z=1], Bi = 0 [b_finite])