Merge f_arithmetic.c into f_generic.c
[openssl.git] / crypto / ec / curve448 / f_generic.c
index 135bab4828bb588fce901644bef812b57d80e8ba..6a3442231e5da3b1d6bf1253d58a339e4ff89b44 100644 (file)
@@ -17,7 +17,7 @@ static const gf MODULUS = {
                   0xffffffffffffff, 0xffffffffffffff)
 };
 
-/** Serialize to wire format. */
+/* Serialize to wire format. */
 void gf_serialize(uint8_t serial[SER_BYTES], const gf x, int with_hibit)
 {
     unsigned int j = 0, fill = 0;
@@ -165,3 +165,36 @@ mask_t gf_eq(const gf a, const gf b)
 
     return word_is_zero(ret);
 }
+
+mask_t gf_isr(gf a, const gf x)
+{
+    gf L0, L1, L2;
+    gf_sqr(L1, x);
+    gf_mul(L2, x, L1);
+    gf_sqr(L1, L2);
+    gf_mul(L2, x, L1);
+    gf_sqrn(L1, L2, 3);
+    gf_mul(L0, L2, L1);
+    gf_sqrn(L1, L0, 3);
+    gf_mul(L0, L2, L1);
+    gf_sqrn(L2, L0, 9);
+    gf_mul(L1, L0, L2);
+    gf_sqr(L0, L1);
+    gf_mul(L2, x, L0);
+    gf_sqrn(L0, L2, 18);
+    gf_mul(L2, L1, L0);
+    gf_sqrn(L0, L2, 37);
+    gf_mul(L1, L2, L0);
+    gf_sqrn(L0, L1, 37);
+    gf_mul(L1, L2, L0);
+    gf_sqrn(L0, L1, 111);
+    gf_mul(L2, L1, L0);
+    gf_sqr(L0, L2);
+    gf_mul(L1, x, L0);
+    gf_sqrn(L0, L1, 223);
+    gf_mul(L1, L2, L0);
+    gf_sqr(L2, L1);
+    gf_mul(L0, L2, x);
+    gf_copy(a, L1);
+    return gf_eq(L0, ONE);
+}