/* -*-c-*-
*
- * $Id: buf.c,v 1.1 2003/10/11 21:02:33 mdw Exp $
+ * $Id: buf.c,v 1.4 2004/04/08 01:36:15 mdw Exp $
*
* Buffer handling
*
* MA 02111-1307, USA.
*/
-/*----- Revision history --------------------------------------------------*
- *
- * $Log: buf.c,v $
- * Revision 1.1 2003/10/11 21:02:33 mdw
- * Import buf stuff from tripe.
- *
- * Revision 1.4 2001/06/19 22:09:54 mdw
- * Expose interface, for use in the proxy.
- *
- * Revision 1.3 2001/03/03 12:06:48 mdw
- * Use 16-bit lengths on MPs, since there's a packet limit of 64K anyway.
- *
- * Revision 1.2 2001/02/16 21:23:20 mdw
- * Various minor changes. Check that MPs are in canonical form when
- * loading.
- *
- * Revision 1.1 2001/02/03 20:26:37 mdw
- * Initial checkin.
- *
- */
-
/*----- Header files ------------------------------------------------------*/
#include <string.h>
-#include <catacomb/mp.h>
-
+#include "mp.h"
+#include "ec.h"
#include "buf.h"
/*----- Main code ---------------------------------------------------------*/
mp *buf_getmp(buf *b)
{
uint16 sz;
+ size_t n;
mp *m;
if (buf_getu16(b, &sz) || buf_ensure(b, sz))
return (0);
m = mp_loadb(MP_NEW, BCUR(b), sz);
- if (mp_octets(m) != sz) {
+ n = mp_octets(m);
+ if (n != sz && n != 0 && sz != 1) {
mp_drop(m);
return (0);
}
{
size_t sz = mp_octets(m);
assert(sz < MASK16);
+ if (!sz) sz = 1;
if (buf_putu16(b, sz) || buf_ensure(b, sz))
return (-1);
mp_storeb(m, BCUR(b), sz);
return (0);
}
+/* --- @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);
+}
+
/*----- That's all, folks -------------------------------------------------*/