silc_mp_add_ui(ret, ret, data[i]);
}
}
+
+/* MP integer encoding with silc_buffer_format. */
+
+int silc_mp_format(SilcStack stack, SilcBuffer buffer,
+ void *value, void *context)
+{
+ SilcMPInt *mp = value;
+ unsigned char *m;
+ SilcUInt32 m_len;
+ int ret;
+
+ /* Encode */
+ m = silc_mp_mp2bin(mp, 0, &m_len);
+ if (!m)
+ return -1;
+
+ ret = silc_buffer_sformat(stack, buffer,
+ SILC_STR_UINT32(m_len),
+ SILC_STR_DATA(m, m_len),
+ SILC_STR_END);
+
+ silc_free(m);
+
+ return ret;
+}
+
+/* MP integer decoding with silc_buffer_unformat. */
+
+int silc_mp_unformat(SilcStack stack, SilcBuffer buffer,
+ void **value, void *context)
+{
+ SilcMPInt *mp = *value;
+ unsigned char *m;
+ SilcUInt32 m_len;
+ int ret;
+
+ ret = silc_buffer_sunformat(stack, buffer,
+ SILC_STR_UI32_NSTRING(&m, &m_len),
+ SILC_STR_END);
+ if (ret < 0)
+ return ret;
+
+ silc_mp_bin2mp(m, m_len, mp);
+
+ return ret;
+}
***/
SilcBool silc_mp_xor(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2);
+/* Utility functions */
+
+/****f* silcmath/silc_mp_format
+ *
+ * SYNOPSIS
+ *
+ * int silc_mp_format(SilcStack stack, SilcBuffer buffer,
+ * void *value, void *context)
+ *
+ * DESCRIPTION
+ *
+ * MP integer encoding function to be used with silc_buffer_format and
+ * SILC_STR_FUNC formatter. The encoded data is of following format:
+ *
+ * SILC_STR_UINT32, integer_len,
+ * SILC_STR_DATA integer_data
+ *
+ * EXAMPLE
+ *
+ * silc_buffer_format(buf,
+ * SILC_STR_FUNC(silc_mp_format, mpint, NULL),
+ * SILC_STR_END);
+ *
+ ***/
+int silc_mp_format(SilcStack stack, SilcBuffer buffer,
+ void *value, void *context);
+
+/****f* silcmath/silc_mp_unformat
+ *
+ * SYNOPSIS
+ *
+ * int silc_mp_unformat(SilcStack stack, SilcBuffer buffer,
+ * void **value, void *context)
+ *
+ * DESCRIPTION
+ *
+ * MP integer decoding function to be used with silc_buffer_unformat and
+ * SILC_STR_FUNC unformatter. This function expects that the length of
+ * the integer is encoded as 32-bit integer and precedes the integer
+ * data.
+ *
+ * EXAMPLE
+ *
+ * SilcMPint mp_ptr;
+ *
+ * silc_mp_init(&mpint);
+ * mp_ptr = &mpint;
+ *
+ * silc_buffer_unformat(buf,
+ * SILC_STR_FUNC(silc_mp_unformat, &mp_ptr, NULL),
+ * SILC_STR_END);
+ *
+ ***/
+int silc_mp_unformat(SilcStack stack, SilcBuffer buffer,
+ void **value, void *context);
+
#endif