1*252470cdSDavid du Colombier /* delimited, authenticated, encrypted connection */ 2*252470cdSDavid du Colombier enum { 3*252470cdSDavid du Colombier Maxmsg = 4096, /* messages > Maxmsg bytes are truncated */ 4*252470cdSDavid du Colombier }; 59a747e4fSDavid du Colombier 6*252470cdSDavid du Colombier typedef struct SConn SConn; 79a747e4fSDavid du Colombier struct SConn { 89a747e4fSDavid du Colombier void *chan; 99a747e4fSDavid du Colombier int secretlen; 10*252470cdSDavid du Colombier int (*secret)(SConn*, uchar*, int); 11*252470cdSDavid du Colombier int (*read)(SConn*, uchar*, int); /* <0 if error; errmess in buffer */ 129a747e4fSDavid du Colombier int (*write)(SConn*, uchar*, int); 13*252470cdSDavid du Colombier void (*free)(SConn*); /* also closes file descriptor */ 149a747e4fSDavid du Colombier }; 159a747e4fSDavid du Colombier 16*252470cdSDavid du Colombier SConn *newSConn(int); /* arg is open file descriptor */ 179a747e4fSDavid du Colombier 18*252470cdSDavid du Colombier /* 19*252470cdSDavid du Colombier * secret(s,b,dir) sets secret for digest, encrypt, using the secretlen 20*252470cdSDavid du Colombier * bytes in b to form keys for the two directions; 21*252470cdSDavid du Colombier * set dir=0 in client, dir=1 in server 22*252470cdSDavid du Colombier */ 239a747e4fSDavid du Colombier 24*252470cdSDavid du Colombier /* error convention: write !message in-band */ 25*252470cdSDavid du Colombier void writerr(SConn*, char*); 26*252470cdSDavid du Colombier 27*252470cdSDavid du Colombier /* 28*252470cdSDavid du Colombier * returns -1 upon error, with error message in buf 29*252470cdSDavid du Colombier * call with buf of size Maxmsg+1 30*252470cdSDavid du Colombier */ 31*252470cdSDavid du Colombier int readstr(SConn*, char*); 32*252470cdSDavid du Colombier 33*252470cdSDavid du Colombier void *emalloc(ulong); /* dies on failure; clears memory */ 34*252470cdSDavid du Colombier void *erealloc(void*, ulong); 35*252470cdSDavid du Colombier char *estrdup(char*); 36