+/**
+ * Encrypt and send a buffer.
+ *
+ * \param scc The context.
+ * \param buf The buffer to send.
+ * \param len The size of \a buf in bytes.
+ *
+ * \return The return value of the underyling call to write_all().
+ *
+ * \sa \ref write_all(), RC4(3).
+ */
+int sc_send_bin_buffer(struct stream_cipher_context *scc, const char *buf,
+ size_t len)
+{
+ int ret;
+ unsigned char *tmp;
+ static unsigned char remainder[RC4_ALIGN];
+ size_t l1 = ROUND_DOWN(len, RC4_ALIGN), l2 = ROUND_UP(len, RC4_ALIGN);
+
+ assert(len);
+ tmp = para_malloc(l2);
+ RC4(&scc->send->key, l1, (const unsigned char *)buf, tmp);
+ if (len > l1) {
+ memcpy(remainder, buf + l1, len - l1);
+ RC4(&scc->send->key, len - l1, remainder, tmp + l1);
+ }
+ ret = write_all(scc->fd, (char *)tmp, &len);
+ free(tmp);
+ return ret;
+}
+
+/**
+ * Encrypt and send a \p NULL-terminated buffer.
+ *
+ * \param scc The context.
+ * \param buf The buffer to send.
+ *
+ * \return The return value of the underyling call to sc_send_bin_buffer().
+ */
+int sc_send_buffer(struct stream_cipher_context *scc, const char *buf)
+{
+ return sc_send_bin_buffer(scc, buf, strlen(buf));