www.pudn.com > sslref30.zip > enc_writ.c


/* enc_writ.c */ 
/* Copyright (C) 1993 Eric Young - see README for more details */ 
#include  
#include "des_locl.h" 
 
int des_enc_write(fd,buf,len,sched,iv) 
int fd; 
char *buf; 
int len; 
des_key_schedule sched; 
des_cblock *iv; 
    { 
    long rnum; 
    int i,j,k,outnum; 
    char outbuf[BSIZE+HDRSIZE]; 
    char shortbuf[8]; 
    char *p; 
    static int start=1; 
 
    /* If we are sending less than 8 bytes, the same char will look 
     * the same if we don't pad it out with random bytes */ 
    if (start) 
        { 
        start=0; 
        srandom(time(NULL)); 
        } 
 
    /* lets recurse if we want to send the data in small chunks */ 
    if (len > MAXWRITE) 
        { 
        j=0; 
        for (i=0; i MAXWRITE)?MAXWRITE:(len-i),sched,iv); 
            if (k < 0) 
                return(k); 
            else 
                j+=k; 
            } 
        return(j); 
        } 
 
    /* write length first */ 
    p=outbuf; 
    l2n(len,p); 
 
    /* pad short strings */ 
    if (len < 8) 
        { 
        p=shortbuf; 
        bcopy(buf,shortbuf,len); 
        for (i=len; i<8; i++) 
            shortbuf[i]=random(); 
        rnum=8; 
        } 
    else 
        { 
        p=buf; 
        rnum=((len+7)/8*8); /* round up to nearest eight */ 
        } 
 
    if (des_rw_mode & DES_PCBC_MODE) 
        pcbc_encrypt((des_cblock *)p,(des_cblock *)&(outbuf[HDRSIZE]), 
            (long)((len<8)?8:len),sched,iv,DES_ENCRYPT);  
    else 
        cbc_encrypt((des_cblock *)p,(des_cblock *)&(outbuf[HDRSIZE]), 
            (long)((len<8)?8:len),sched,iv,DES_ENCRYPT);  
 
    /* output */ 
    outnum=rnum+HDRSIZE; 
 
    for (j=0; j