+/* --- @buf_getec@ --- *
+ *
+ * Arguments: @buf *b@ = pointer to a buffer block
+ * @ec *p@ = where to put the point
+ *
+ * Returns: Zero if it worked, nonzero if it failed.
+ *
+ * Use: Gets a multiprecision integer from a buffer. The point must
+ * be initialized.
+ */
+
+int buf_getec(buf *b, ec *p)
+{
+ mp *x = 0, *y = 0;
+ uint16 n;
+ if (buf_ensure(b, 2)) return (-1);
+ n = LOAD16(BCUR(b)); if (!n) { BSTEP(b, 2); EC_SETINF(p); return (0); }
+ if ((x = buf_getmp(b)) == 0 || (y = buf_getmp(b)) == 0) {
+ mp_drop(x); mp_drop(y); return (-1);
+ }
+ EC_DESTROY(p); p->x = x; p->y = y; p->z = 0;
+ return (0);
+}
+
+/* --- @buf_putec@ --- *
+ *
+ * Arguments: @buf *b@ = pointer to a buffer block
+ * @ec *p@ = an elliptic curve point
+ *
+ * Returns: Zero if it worked, nonzero if there wasn't enough space.
+ *
+ * Use: Puts an elliptic curve point to a buffer.
+ */
+
+int buf_putec(buf *b, ec *p)
+{
+ if (EC_ATINF(p)) return (buf_putu16(b, 0));
+ if (buf_putmp(b, p->x) || buf_putmp(b, p->y)) return (-1);
+ return (0);
+}
+