+
+/** Information about one encrypted connection. */
+struct crypt_data {
+ /** Function used to decrypt received data. */
+ crypt_function *recv;
+ /** Function used to encrypt data to be sent. */
+ crypt_function *send;
+ /**
+ * Context-dependent data (crypt keys), passed verbatim to the above
+ * crypt functions.
+ */
+ void *private_data;
+};
+/** Array holding per fd crypt data. */
+static struct crypt_data *crypt_data_array;
+/** Current size of the crypt data array. */
+static unsigned cda_size = 0;
+
+/**
+ * activate encryption for one file descriptor
+ *
+ * \param fd the file descriptor
+ * \param recv_f the function used for decrypting received data
+ * \param send_f the function used for encrypting before sending
+ * \param private_data user data supplied by the caller
+ */
+void enable_crypt(int fd, crypt_function *recv_f, crypt_function *send_f,
+ void *private_data)
+{
+ if (fd + 1 > cda_size) {
+ crypt_data_array = para_realloc(crypt_data_array,
+ (fd + 1) * sizeof(struct crypt_data));
+ memset(crypt_data_array + cda_size, 0,
+ (fd + 1 - cda_size) * sizeof(struct crypt_data));
+ cda_size = fd + 1;
+ }
+ crypt_data_array[fd].recv = recv_f;
+ crypt_data_array[fd].send = send_f;
+ crypt_data_array[fd].private_data = private_data;
+ PARA_INFO_LOG("rc4 encryption activated for fd %d\n", fd);
+}
+
+/**
+ * deactivate encryption for a given fd
+ *
+ * \param fd the file descriptor
+ *
+ * This must be called if and only if \p fd was activated via enable_crypt().
+ */
+void disable_crypt(int fd)
+{
+ if (cda_size < fd + 1)
+ return;
+ crypt_data_array[fd].recv = NULL;
+ crypt_data_array[fd].send = NULL;
+ crypt_data_array[fd].private_data = NULL;
+}