|
|
1.1 ! root 1: /*- ! 2: * Copyright (c) 1989 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that: (1) source distributions retain this entire copyright ! 7: * notice and comment, and (2) distributions including binaries display ! 8: * the following acknowledgement: ``This product includes software ! 9: * developed by the University of California, Berkeley and its contributors'' ! 10: * in the documentation or other materials provided with the distribution ! 11: * and in all advertising materials mentioning features or use of this ! 12: * software. Neither the name of the University nor the names of its ! 13: * contributors may be used to endorse or promote products derived ! 14: * from this software without specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: static char sccsid[] = "@(#)des_rw.c 5.5 (Berkeley) 6/1/90"; ! 22: #endif /* not lint */ ! 23: ! 24: #include <sys/param.h> ! 25: #include <kerberosIV/des.h> ! 26: #include <kerberosIV/krb.h> ! 27: ! 28: extern long random(); ! 29: static unsigned char des_inbuf[10240], storage[10240], *store_ptr; ! 30: static bit_64 *key; ! 31: static u_char *key_schedule; ! 32: ! 33: /* ! 34: * NB: These routines will not function properly if NBIO ! 35: * is set ! 36: */ ! 37: ! 38: /* ! 39: * des_set_key ! 40: * ! 41: * Set des encryption/decryption key for use by the des_read and ! 42: * des_write routines ! 43: * ! 44: * The inkey parameter is actually the DES initial vector, ! 45: * and the insched is the DES Key unwrapped for faster decryption ! 46: */ ! 47: ! 48: void ! 49: des_set_key(inkey, insched) ! 50: bit_64 *inkey; ! 51: u_char *insched; ! 52: { ! 53: key = inkey; ! 54: key_schedule = insched; ! 55: } ! 56: ! 57: void ! 58: des_clear_key() ! 59: { ! 60: bzero((char *) key, sizeof(C_Block)); ! 61: bzero((char *) key_schedule, sizeof(Key_schedule)); ! 62: } ! 63: ! 64: ! 65: int ! 66: des_read(fd, buf, len) ! 67: int fd; ! 68: register char *buf; ! 69: int len; ! 70: { ! 71: int nreturned = 0; ! 72: long net_len, rd_len; ! 73: int nstored = 0; ! 74: ! 75: if (nstored >= len) { ! 76: (void) bcopy(store_ptr, buf, len); ! 77: store_ptr += len; ! 78: nstored -= len; ! 79: return(len); ! 80: } else if (nstored) { ! 81: (void) bcopy(store_ptr, buf, nstored); ! 82: nreturned += nstored; ! 83: buf += nstored; ! 84: len -= nstored; ! 85: nstored = 0; ! 86: } ! 87: ! 88: if (krb_net_read(fd, &net_len, sizeof(net_len)) != sizeof(net_len)) { ! 89: /* XXX can't read enough, pipe ! 90: must have closed */ ! 91: return(0); ! 92: } ! 93: net_len = ntohl(net_len); ! 94: if (net_len <= 0 || net_len > sizeof(des_inbuf)) { ! 95: /* preposterous length; assume out-of-sync; only ! 96: recourse is to close connection, so return 0 */ ! 97: return(0); ! 98: } ! 99: /* the writer tells us how much real data we are getting, but ! 100: we need to read the pad bytes (8-byte boundary) */ ! 101: rd_len = roundup(net_len, 8); ! 102: if (krb_net_read(fd, des_inbuf, rd_len) != rd_len) { ! 103: /* pipe must have closed, return 0 */ ! 104: return(0); ! 105: } ! 106: (void) des_pcbc_encrypt(des_inbuf, /* inbuf */ ! 107: storage, /* outbuf */ ! 108: net_len, /* length */ ! 109: key_schedule, /* DES key */ ! 110: key, /* IV */ ! 111: DECRYPT); /* direction */ ! 112: ! 113: if(net_len < 8) ! 114: store_ptr = storage + 8 - net_len; ! 115: else ! 116: store_ptr = storage; ! 117: ! 118: nstored = net_len; ! 119: if (nstored > len) { ! 120: (void) bcopy(store_ptr, buf, len); ! 121: nreturned += len; ! 122: store_ptr += len; ! 123: nstored -= len; ! 124: } else { ! 125: (void) bcopy(store_ptr, buf, nstored); ! 126: nreturned += nstored; ! 127: nstored = 0; ! 128: } ! 129: ! 130: return(nreturned); ! 131: } ! 132: ! 133: static unsigned char des_outbuf[10240]; /* > longest write */ ! 134: ! 135: int ! 136: des_write(fd, buf, len) ! 137: int fd; ! 138: char *buf; ! 139: int len; ! 140: { ! 141: static int seeded = 0; ! 142: static char garbage_buf[8]; ! 143: long net_len, garbage; ! 144: ! 145: if(len < 8) { ! 146: if(!seeded) { ! 147: seeded = 1; ! 148: srandom((int) time((long *)0)); ! 149: } ! 150: garbage = random(); ! 151: /* insert random garbage */ ! 152: (void) bcopy(&garbage, garbage_buf, MIN(sizeof(long),8)); ! 153: /* this "right-justifies" the data in the buffer */ ! 154: (void) bcopy(buf, garbage_buf + 8 - len, len); ! 155: } ! 156: /* pcbc_encrypt outputs in 8-byte (64 bit) increments */ ! 157: ! 158: (void) des_pcbc_encrypt((len < 8) ? garbage_buf : buf, ! 159: des_outbuf, ! 160: (len < 8) ? 8 : len, ! 161: key_schedule, /* DES key */ ! 162: key, /* IV */ ! 163: ENCRYPT); ! 164: ! 165: /* tell the other end the real amount, but send an 8-byte padded ! 166: packet */ ! 167: net_len = htonl(len); ! 168: (void) write(fd, &net_len, sizeof(net_len)); ! 169: (void) write(fd, des_outbuf, roundup(len,8)); ! 170: return(len); ! 171: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.