Make crypo a per fd feature
[paraslash.git] / client.c
index dba99a28749850ed3f797b8859cdbc8de008920d..0380d5678b3aae84d34bdb62838c3f9cd475cf82 100644 (file)
--- a/client.c
+++ b/client.c
@@ -38,6 +38,9 @@ struct private_client_data {
        char *config_file;
        char *key_file;
        char *user;
+       RC4_KEY rc4_recv_key;
+       RC4_KEY rc4_send_key;
+
        char *in_buf;
        size_t *in_loaded;
        char *out_buf;
@@ -116,22 +119,17 @@ out:
        return ret;
 }
 
-static RC4_KEY rc4_recv_key;
-static RC4_KEY rc4_send_key;
-static unsigned char rc4_buf[2 * RC4_KEY_LEN];
-
-static void rc4_send(unsigned long len, const unsigned char *indata, unsigned char *outdata)
+static void rc4_send(unsigned long len, const unsigned char *indata,
+               unsigned char *outdata)
 {
-       RC4(&rc4_send_key, len, indata, outdata);
+       RC4(&pcd->rc4_send_key, len, indata, outdata);
 }
 
-static void rc4_recv(unsigned long len, const unsigned char *indata, unsigned char *outdata)
+static void rc4_recv(unsigned long len, const unsigned char *indata,
+               unsigned char *outdata)
 {
-       RC4(&rc4_recv_key, len, indata, outdata);
+       RC4(&pcd->rc4_recv_key, len, indata, outdata);
 }
-void (*crypt_function_recv)(unsigned long len, const unsigned char *indata, unsigned char *outdata);
-void (*crypt_function_send)(unsigned long len, const unsigned char *indata, unsigned char *outdata);
-
 
 static void append_str(char **data, const char* append)
 {
@@ -174,6 +172,7 @@ int main(int argc, char *argv[])
        char buf[8192];
        char *auth_str;
        long unsigned challenge_nr;
+       unsigned char rc4_buf[2 * RC4_KEY_LEN] = "";
 
        ret = client_parse_config(argc, argv, &pcd);
        if (ret < 0)
@@ -194,8 +193,6 @@ int main(int argc, char *argv[])
        /* concat args */
        for (i = 0; i < pcd->conf.inputs_num; i++)
                append_str(&command, pcd->conf.inputs[i]);
-       crypt_function_recv = NULL;
-       crypt_function_send = NULL;
        /* get the host info */
        PARA_NOTICE_LOG("getting host info of %s\n",
                pcd->conf.hostname_arg);
@@ -264,12 +261,11 @@ int main(int argc, char *argv[])
                        numbytes - PROCEED_MSG_LEN - 1);
                if (ret < 0)
                        goto out;
-               RC4_set_key(&rc4_send_key, RC4_KEY_LEN, rc4_buf);
-               RC4_set_key(&rc4_recv_key, RC4_KEY_LEN, rc4_buf + RC4_KEY_LEN);
-               PARA_INFO_LOG("rc4 encrytion activated: %x:%x:%x:%x\n",
+               RC4_set_key(&pcd->rc4_send_key, RC4_KEY_LEN, rc4_buf);
+               RC4_set_key(&pcd->rc4_recv_key, RC4_KEY_LEN, rc4_buf + RC4_KEY_LEN);
+               PARA_INFO_LOG("rc4 encryption activated: %x:%x:%x:%x\n",
                        rc4_buf[0], rc4_buf[1], rc4_buf[2], rc4_buf[3]);
-               crypt_function_recv = rc4_recv;
-               crypt_function_send = rc4_send;
+               enable_crypt(pcd->fd, rc4_recv, rc4_send);
        }
        /* send command */
        PARA_INFO_LOG("--> %s\n", command);