extern int have_authorization, have_file, done;
extern C_Block session;
+static des_key_schedule sched;
+static des_cblock ivec;
int get_block();
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);
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;
#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:
*/
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);
}
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);
}
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);
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",