Skip to content

Commit

Permalink
fix fp2 inv
Browse files Browse the repository at this point in the history
  • Loading branch information
ww-rm committed Jun 9, 2024
1 parent 3b9c255 commit d76a73f
Showing 1 changed file with 13 additions and 31 deletions.
44 changes: 13 additions & 31 deletions src/gmalglib/core/sm9curve.c
Original file line number Diff line number Diff line change
Expand Up @@ -983,44 +983,26 @@ int SM9FP2_MontHasSqrt(const SM9FP2Mont* x, SM9FP2Mont* y)
static
void SM9FP2_MontInv(const SM9FP2Mont* x, SM9FP2Mont* y)
{
// use method of undetermined coefficients
const SM9FP1Mont* x1 = x->fp1 + 1;
const SM9FP1Mont* x0 = x->fp1;

SM9FP2Mont y_tmp = { 0 };
SM9FP1Mont* y1 = y_tmp.fp1 + 1;
SM9FP1Mont* y0 = y_tmp.fp1;

if (UInt256_IsZero(x0))
{
// (-1 / 2x1, 0)
UInt256_SetZero(y0);
SM9FP1_Add(x1, x1, y1);
SM9FP1_MontInv(y1, y1);
SM9FP1_Neg(y1, y1);
}
else if (UInt256_IsZero(x1))
{
// (0, 1 / x0)
UInt256_SetZero(y1);
SM9FP1_MontInv(x0, y0);
}
else
{
// t = 1 / (x0^2 + 2(x1^2))
SM9FP1_MontMul(x0, x0, y0); // x0^2
SM9FP1_MontMul(x1, x1, y1); // x1^2
SM9FP1_Add(y0, y1, y0);
SM9FP1_Add(y0, y1, y0); // x0^2 + 2(x1^2)
SM9FP1_MontInv(y0, y0); // 1 / (x0^2 + 2(x1^2))

// y1 = -tx1
SM9FP1_MontMul(y0, x1, y1);
SM9FP1_Neg(y1, y1);

// y0 = tx0
SM9FP1_MontMul(y0, x0, y0);
}
// det = x0^2 + 2(x1^2)
SM9FP1_MontMul(x0, x0, y0);
SM9FP1_MontMul(x1, x1, y1);
SM9FP1_Add(y0, y1, y0);
SM9FP1_Add(y0, y1, y0);
SM9FP1_MontInv(y0, y0);

// y1 = -x1 / det
SM9FP1_MontMul(y0, x1, y1);
SM9FP1_Neg(y1, y1);

// y0 = x0 / det
SM9FP1_MontMul(y0, x0, y0);

*y = y_tmp;
}
Expand Down

0 comments on commit d76a73f

Please sign in to comment.