diff --git a/ecc-add-ehh.c b/ecc-add-ehh.c index 140a6d7cfdd5a13d954412092f85f97d73774f4d..33dc19064d7fcbd98500a71a73d73310c3e130dc 100644 --- a/ecc-add-ehh.c +++ b/ecc-add-ehh.c @@ -72,9 +72,9 @@ ecc_add_ehh (const struct ecc_curve *ecc, E = b*C*D 2 mul A, B, C, D, E F = B - E A, B, C, D, E, F G = B + E A, C, D, F, G - x3 = a*f*[(x1+y1)(x2+y2) - c - d] 3 mul A, C, D, G - y3 = a*g*(d-c) 2 mul F, G - z3 = f*g mul + x3 = A*F*[(x1+y1)(x2+y2) - C - D] 3 mul A, C, D, G + y3 = A*G*(D-C) 2 mul F, G + z3 = F*G mul */ #define A scratch #define B (scratch + ecc->size) diff --git a/ecc-eh-to-a.c b/ecc-eh-to-a.c index bd0625d4a061482f22aaf33fe3c29f2afedd6693..aaeaf09df0e77b1c4a178130cc5b9dead16af482 100644 --- a/ecc-eh-to-a.c +++ b/ecc-eh-to-a.c @@ -74,7 +74,10 @@ ecc_eh_to_a (const struct ecc_curve *ecc, ecc_modp_sub (ecc, izp, wp, vp); /* FIXME: For the infinity point, this subtraction gives zero (mod - p), and the inversion below fails and returns something else. */ + p), which isn't invertible. For curve25519, the desired output is + x = 0, which we get if the modular inversion function returns 0 + in this case. Need to check that modular inversion really returns + 0. */ ecc_modp_mul (ecc, izp + ecc->size, izp, up); /* Needs 3*size scratch */ ecc_modp_inv (ecc, izp, izp + ecc->size, izp + 2*ecc->size);