X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fdes%2Fenc_writ.c;h=af5b8c2349bba80fd02dba4d0314fb0e3d3819aa;hp=33ca700d71aa502488f298a8f7c405396d915c7f;hb=55b1516770ddd2321f3dda3b81f1ddb671233d3e;hpb=4e31df2cd73dbb659fd8a6eca6270fac661c072d diff --git a/crypto/des/enc_writ.c b/crypto/des/enc_writ.c index 33ca700d71..af5b8c2349 100644 --- a/crypto/des/enc_writ.c +++ b/crypto/des/enc_writ.c @@ -58,33 +58,44 @@ #include #include +#include +#include "cryptlib.h" #include "des_locl.h" +#include -int des_enc_write(fd, buf, len, sched, iv) -int fd; -const char *buf; -int len; -des_key_schedule sched; -des_cblock iv; +/* + * WARNINGS: + * + * - The data format used by DES_enc_write() and DES_enc_read() + * has a cryptographic weakness: When asked to write more + * than MAXWRITE bytes, DES_enc_write will split the data + * into several chunks that are all encrypted + * using the same IV. So don't use these functions unless you + * are sure you know what you do (in which case you might + * not want to use them anyway). + * + * - This code cannot handle non-blocking sockets. + */ + +int DES_enc_write(int fd, const void *_buf, int len, + DES_key_schedule *sched, DES_cblock *iv) { #ifdef _LIBC - extern int srandom(); extern unsigned long time(); - extern int random(); extern int write(); #endif - + const unsigned char *buf=_buf; long rnum; int i,j,k,outnum; - static char *outbuf=NULL; - char shortbuf[8]; - char *p; - const char *cp; + static unsigned char *outbuf=NULL; + unsigned char shortbuf[8]; + unsigned char *p; + const unsigned char *cp; static int start=1; if (outbuf == NULL) { - outbuf=(char *)malloc(BSIZE+HDRSIZE); + outbuf=OPENSSL_malloc(BSIZE+HDRSIZE); if (outbuf == NULL) return(-1); } /* If we are sending less than 8 bytes, the same char will look @@ -92,7 +103,6 @@ des_cblock iv; if (start) { start=0; - srandom((unsigned int)time(NULL)); } /* lets recurse if we want to send the data in small chunks */ @@ -101,7 +111,7 @@ des_cblock iv; j=0; for (i=0; i MAXWRITE)?MAXWRITE:(len-i),sched,iv); if (k < 0) return(k); @@ -119,9 +129,8 @@ des_cblock iv; if (len < 8) { cp=shortbuf; - memcpy(shortbuf,buf,(unsigned int)len); - for (i=len; i<8; i++) - shortbuf[i]=random(); + memcpy(shortbuf,buf,len); + RAND_pseudo_bytes(shortbuf+len, 8-len); rnum=8; } else @@ -130,26 +139,29 @@ des_cblock iv; rnum=((len+7)/8*8); /* round up to nearest eight */ } - if (des_rw_mode & DES_PCBC_MODE) - des_pcbc_encrypt(cp,&(outbuf[HDRSIZE]),(len<8)?8:len,sched,iv, + if (DES_rw_mode & DES_PCBC_MODE) + DES_pcbc_encrypt(cp,&(outbuf[HDRSIZE]),(len<8)?8:len,sched,iv, DES_ENCRYPT); else - des_cbc_encrypt(cp,&(outbuf[HDRSIZE]),(len<8)?8:len,sched,iv, + DES_cbc_encrypt(cp,&(outbuf[HDRSIZE]),(len<8)?8:len,sched,iv, DES_ENCRYPT); /* output */ - outnum=(int)rnum+HDRSIZE; + outnum=rnum+HDRSIZE; for (j=0; j