/* -*-c-*-
*
- * $Id: ec.h,v 1.5 2004/03/21 22:52:06 mdw Exp $
+ * $Id: ec.h,v 1.7 2004/03/23 15:19:32 mdw Exp $
*
* Elliptic curve definitions
*
/*----- Revision history --------------------------------------------------*
*
* $Log: ec.h,v $
+ * Revision 1.7 2004/03/23 15:19:32 mdw
+ * Test elliptic curves more thoroughly.
+ *
+ * Revision 1.6 2004/03/22 02:19:10 mdw
+ * Rationalise the sliding-window threshold. Drop guarantee that right
+ * arguments to EC @add@ are canonical, and fix up projective implementations
+ * to cope.
+ *
* Revision 1.5 2004/03/21 22:52:06 mdw
* Merge and close elliptic curve branch.
*
/* --- Elliptic curve operations --- *
*
* All operations (apart from @destroy@ and @in@) are guaranteed to be
- * performed on internal representations of points. Moreover, the second
- * argument to @add@ and @mul@ is guaranteed to be the output of @in@ or
- * @fix@.
+ * performed on internal representations of points.
+ *
+ * (Historical note. We used to guarantee that the second to @add@ and @mul@
+ * was the output of @in@ or @fix@, but this canonification turned out to
+ * make the precomputation in @ec_exp@ too slow. Projective implementations
+ * must therefore cope with a pair of arbitrary points.)
*/
typedef struct ec_ops {
extern ec *ec_copy(ec */*d*/, const ec */*p*/);
+/* --- @ec_eq@ --- *
+ *
+ * Arguments: @const ec *p, *q@ = two points
+ *
+ * Returns: Nonzero if the points are equal. Compares external-format
+ * points.
+ */
+
+#define EC_EQ(p, q) \
+ ((EC_ATINF(p) && EC_ATINF(q)) || \
+ (!EC_ATINF(p) && !EC_ATINF(q) && \
+ MP_EQ((p)->x, (q)->x) && \
+ MP_EQ((p)->y, (q)->y)))
+
+extern int ec_eq(const ec *p, const ec *q);
+
/*----- Interesting arithmetic --------------------------------------------*/
/* --- @ec_find@ --- *
extern ec *ec_find(ec_curve */*c*/, ec */*d*/, mp */*x*/);
+/* --- @ec_rand@ --- *
+ *
+ * Arguments: @ec_curve *c@ = pointer to an elliptic curve
+ * @ec *d@ = pointer to the destination point
+ * @grand *r@ = random number source
+ *
+ * Returns: The destination @d@.
+ *
+ * Use: Finds a random point on the given curve.
+ */
+
+extern ec *ec_rand(ec_curve */*c*/, ec */*d*/, grand */*r*/);
+
/* --- @ec_neg@ --- *
*
* Arguments: @ec_curve *c@ = pointer to an elliptic curve