#include "error.h"
-/** holds information about one encrypted connection */
+/** Information about one encrypted connection. */
struct crypt_data {
- /** function used to decrypt received data */
+ /** Function used to decrypt received data. */
crypt_function *recv;
- /** function used to encrypt data to be sent */
+ /** Function used to encrypt data to be sent. */
crypt_function *send;
- /** context-dependent data, passed to \a recv() and \a send() */
+ /**
+ * Context-dependent data (crypt keys), passed verbatim to the above
+ * crypt functions.
+ */
void *private_data;
};
-/** array holding per fd crypt data per */
+/** Array holding per fd crypt data. */
static struct crypt_data *crypt_data_array;
-/** current size of the crypt data array */
+/** Current size of the crypt data array. */
static unsigned cda_size = 0;
-
/**
* activate encryption for one file descriptor
*
total += n;
bytesleft -= n;
if (total < *len)
- PARA_DEBUG_LOG("short write (%zd byte(s) left)",
+ PARA_DEBUG_LOG("short write (%zd byte(s) left)\n",
*len - total);
}
*len = total; /* return number actually sent here */
cf = crypt_data_array[fd].send;
if (cf) {
void *private = crypt_data_array[fd].private_data;
- unsigned char *outbuf = para_malloc(len);
+ /* RC4 may write more than len to the output buffer */
+ unsigned char *outbuf = para_malloc(ROUND_UP(len, 8));
(*cf)(len, (unsigned char *)buf, outbuf, private);
ret = sendall(fd, (char *)outbuf, &len);
free(outbuf);