/*
 * Encrypted stream library for use with krb5.
 */
#include <krb5/krb5.h>
#include "estreamP.h"
#include "estream.h"

unix_write(fptr, buf, size)
    char *fptr;
    char *buf;
    int size;
{
    int fd = *(int *)fptr;
    
    return(write(fd, buf, size));
}

unix_read(fptr, buf, size)
    char *fptr;
    char *buf;
    int size;
{
    int fd = *(int *)fptr;
    
    return(read(fd, buf, size));
}

estream eopen(str, r_func, w_func, priv, etype, seqno, skey)
    estream str;
    io_func r_func;
    io_func w_func;
    krb5_enctype etype;
    krb5_int32 seqno;
    krb5_keyblock *skey;
{
    krb5_error retval;
    krb5_encrypt_block eblock;
    krb5_address **localaddrs = NULL;
    
    str = (estream)malloc(sizeof (estream_data));
    bzero(str, sizeof (estream_data));
    str->read_func = r_func;
    str->write_func = w_func;
    str->etype = etype;
    str->seqno = seqno;
    str->skey = skey;
    if (retval = krb5_os_localaddr(&localaddrs))
    {
	free(str);
	return NULL;
    }
    if (!(localaddrs && localaddrs[0]))
    {
	free(str);
	return NULL;
    }
    str->my_addr = (krb5_address *)malloc(sizeof (krb5_address));
    if (str->my_addr == NULL)
    {
	krb5_free_addresses(localaddrs);
	free(str);
	return NULL;
    }
    bcopy(localaddrs[0], str->my_addr, sizeof (krb5_address));
    krb5_free_addresses(localaddrs);
    krb5_use_cstype(&eblock, etype);
    str->in_ivec = (char *)malloc(eblock.crypto_entry->block_length);
    if (str->in_ivec == NULL)
    {
	free(str->myaddr);
	free(str);
	return NULL;
    }
    str->out_ivec = (char *)malloc(eblock.crypto_entry->block_length);
    if (str->out_ivec ==NULL)
    {
	free(str->myaddr);
	free(str->in_ivec);
	free(str);
	return NULL;
    }
    str->in = (rbuf *)malloc(sizeof (rbuf_data));
    if (str->in == NULL)
    {
	free(str->myaddr);
	free(str->in_ivec);
	free(str->out_ivec);
	free(str);
	return NULL;
    }
    str->out = (rbuf *)malloc(sizeof (rbuf_data));
    if (str->out == NULL)
    {
	free(str->myaddr);
	free(str->in_ivec);
	free(str->out_ivec);
	free(str->in);
	free(str);
	return NULL;
    }
    return str;
}

void eclose(str)
    estream str;
{
    free(str->myaddr);
    free(str->in_ivec);
    free(str->out_ivec);
    free(str->in);
    free(str->out);
    free(str);
}

eread(str, buf, len)
    estream str;
    char *buf;
    int len;
{
}

ewrite(str, buf, len)
    estream str;
    char *buf;
    int len;
{
}
