]> andersk Git - moira.git/commitdiff
make encrypted transfers work
authormar <mar>
Tue, 22 Sep 1992 13:42:13 +0000 (13:42 +0000)
committermar <mar>
Tue, 22 Sep 1992 13:42:13 +0000 (13:42 +0000)
update/get_file.c
update/send_file.c

index 540a2a47a96bd6a29bc040be6b5af49f5a3caab2..249541fb7bf37b6e2d1e568a59af8a4f7ae82b4d 100644 (file)
@@ -32,6 +32,8 @@ extern int code, errno, uid;
 
 extern int have_authorization, have_file, done;
 extern C_Block session;
+static des_key_schedule sched;
+static des_cblock ivec;
 
 int get_block();
 
@@ -131,6 +133,15 @@ get_file(pathname, file_size, checksum, mode, encrypt)
     lseek(fd, 0, L_SET);
     if (send_ok())
        lose("sending okay for file transfer (get_file)");
+    if (encrypt) {
+#ifdef DEBUG
+       com_err(whoami, 0, "Session %02x %02x %02x %02x  %02x %02x %02x %02x",
+               session[0], session[1], session[2], session[3], 
+               session[4], session[5], session[6], session[7]);
+#endif /* DEBUG */
+       des_key_sched(session, sched);
+       bcopy(session, ivec, sizeof(ivec));
+    }
     n_written = 0;
     while (n_written < file_size && code == 0) {
        int n_got = get_block(fd, file_size - n_written, encrypt);
@@ -192,28 +203,25 @@ get_block(fd, max_size, encrypt)
     int encrypt;
 {
     STRING data;
-    int n_read, n;
+    unsigned char dst[UPDATE_BUFSIZ + 8], *src;
+    int n_read, n, i;
 
     code = receive_object(conn, (char *)&data, STRING_T);
     if (code) {
        code = connection_errno(conn);
        lose("receiving data file (get_file)");
     }
-    n_read = MIN(MAX_STRING_SIZE(data), max_size);
-    if (encrypt) {
-       des_key_schedule sched;
-       des_cblock ivec;
-       STRING newdata;
 
-       des_key_sched(session, sched);
-       bzero(ivec, sizeof(ivec));
-       STRING_DATA(newdata) = (char *) malloc(n_read+9);
-       des_pcbc_encrypt(STRING_DATA(data), STRING_DATA(newdata),
-                        n_read, sched, &ivec, 1);
-       string_free(&data);
-       data.ptr = newdata.ptr;
+    if (encrypt) {
+       src = (unsigned char *)STRING_DATA(data);
+       n = MAX_STRING_SIZE(data);
+       des_pcbc_encrypt(src, dst, n, sched, ivec, 1);
+       for (i = 0; i < 8; i++)
+         ivec[i] = src[n - 8 + i] ^ dst[n - 8 + i];
+       bcopy(dst, STRING_DATA(data), n);
     }
 
+    n_read = MIN(MAX_STRING_SIZE(data), max_size);
     n = 0;
     while (n < n_read) {
        register int n_wrote;
index 2c4932cfca8c76890744b7ca81a1ab5c4045dc8f..60ba84795a67860f6c7d7e99b01a22a414e58ebd 100644 (file)
@@ -18,12 +18,15 @@ static char *rcsid_send_file_c = "$Header$";
 #include <moira.h>
 #include <sys/file.h>
 #include <sys/stat.h>
+#include <des.h>
+#include <krb.h>
 #include <update.h>
 
 
 extern CONNECTION conn;
 extern int errno;
 char buf[BUFSIZ];
+extern C_Block session;
 
 /*
  * syntax:
@@ -43,15 +46,17 @@ char buf[BUFSIZ];
  */
 
 int
-send_file(pathname, target_path)
+send_file(pathname, target_path, encrypt)
 char *pathname;
 char *target_path;
+int  encrypt;
 {
-    int n, fd, code, n_to_send;
+    int n, fd, code, n_to_send, i;
     STRING data;
+    unsigned char dst[UPDATE_BUFSIZ + 8], *src;
     struct stat statb;
-
-    string_alloc(&data, UPDATE_BUFSIZ);
+    des_key_schedule sched;
+    des_cblock ivec;
 
     /* send file over */
     fd = open(pathname, O_RDONLY, 0);
@@ -66,22 +71,24 @@ char *target_path;
     }
     n_to_send = statb.st_size;
     
-    sprintf(STRING_DATA(data), "XFER_002 %d %d %s",
-           n_to_send, checksum_file(pathname), target_path);
+    string_alloc(&data, UPDATE_BUFSIZ);
+    sprintf(STRING_DATA(data), "XFER_00%c %d %d %s",
+           (encrypt ? '3' : '2'), n_to_send,
+           checksum_file(pathname), target_path);
     code = send_object(conn, (char *)&data, STRING_T);
     if (code) {
-       com_err(whoami, code, " sending XFER_002 request");
+       com_err(whoami, code, " sending XFER request");
        close(fd);
        return(code);
     }
     code = receive_object(conn, (char *)&n, INTEGER_T);
     if (code) {
-       com_err(whoami, code, " getting reply from XFER_002 request");
+       com_err(whoami, code, " getting reply from XFER request");
        close(fd);
        return(code);
     }
     if (n) {
-       com_err(whoami, n, " transfer request (XFER_002) rejected");
+       com_err(whoami, n, " transfer request (XFER) rejected");
        close(fd);
        return(n);
     }
@@ -99,6 +106,16 @@ char *target_path;
        return(n);
     }
 
+    if (encrypt) {
+#ifdef DEBUG
+       printf("Session key %02x %02x %02x %02x  %02x %02x %02x %02x\n",
+              session[0], session[1], session[2], session[3], 
+              session[4], session[5], session[6], session[7]);
+#endif /* DEBUG */
+       des_key_sched(session, sched);
+       bcopy(session, ivec, sizeof(ivec));
+    }
+
     while (n_to_send > 0) {
 #ifdef DEBUG
        printf("n_to_send = %d\n", n_to_send);
@@ -110,6 +127,18 @@ char *target_path;
            return(MR_ABORTED);
        }
        MAX_STRING_SIZE(data) = n;
+       if (encrypt) {
+           src = (unsigned char *)STRING_DATA(data);
+           bcopy(src, dst, n);
+           bzero(dst + n, 7);
+           /* encrypt! */
+           des_pcbc_encrypt(dst, src, n, sched, ivec, 0);
+           /* save vector to continue chaining */
+           for (i = 0; i < 8; i++)
+             ivec[i] = dst[n - 8 + i] ^ src[n - 8 + i];
+           /* round up to multiple of 8 */
+           data.length = (data.length + 7) & 0xfffffff8;
+       }
        code = send_object(conn, (char *)&data, STRING_T);
        if (code) {
            com_err(whoami, connection_errno(conn), " transmitting file %s",
This page took 0.046322 seconds and 5 git commands to generate.