plan 9 kernel history: overview | file list | diff list

1996/0223/port/devssl.c (diff list | history)

1996/0202/sys/src/9/port/devssl.c:10,161996/0223/sys/src/9/port/devssl.c:10,15 (short | long | prev | next)
1995/1213    
#include	"../port/error.h" 
#include	<libcrypt.h> 
 
#include	"devtab.h" 
 
typedef struct OneWay OneWay; 
struct OneWay 
1996/0202/sys/src/9/port/devssl.c:191,2221996/0223/sys/src/9/port/devssl.c:190,195
1995/1213    
	} 
} 
 
long 
sslread(Chan *c, void *a, long n, ulong offset) 
{ 
	Block *b; 
                 
	switch(c->qid.path & ~CHDIR){ 
	case Qdir: 
		return devdirread(c, a, n, digesttab, Ndigesttab, devgen); 
	} 
                 
	b = sslbread(c, n, offset); 
                 
	if(waserror()){ 
		freeb(b); 
		nexterror(); 
	} 
                 
	n = BLEN(b); 
	memmove(a, b->rp, n); 
	freeb(b); 
                 
	poperror(); 
                 
	return n; 
} 
                 
1995/1217    
Block* 
sslbread(Chan *c, long n, ulong offset) 
1995/1213    
{ 
1996/0202/sys/src/9/port/devssl.c:301,3941996/0223/sys/src/9/port/devssl.c:274,301
1995/1213    
} 
 
long 
1995/1218    
sslwrite(Chan *c, void *a, long n, ulong offset) 
1996/0223    
sslread(Chan *c, void *a, long n, ulong offset) 
1995/1213    
{ 
	Dstate *s; 
	Block *b; 
1995/1218    
	int m; 
	char *p, *e, buf[32]; 
1995/1213    
 
	switch(c->qid.path & ~CHDIR){ 
	case Qclone: 
		break; 
	default: 
		error(Ebadusefd); 
1996/0223    
	case Qdir: 
		return devdirread(c, a, n, digesttab, Ndigesttab, devgen); 
1995/1213    
	} 
 
	s = c->aux; 
	if(s == 0) 
		error(Ebadusefd); 
1996/0223    
	b = sslbread(c, n, offset); 
1995/1213    
 
	switch(s->state){ 
	case Algwait: 
		/* get algorithm */ 
		if(n >= sizeof(buf)) 
1996/0202    
			error(Ebadarg); 
1995/1213    
		strncpy(buf, a, n); 
		buf[n] = 0; 
		s->blocklen = 1; 
		s->diglen = 0; 
		if(strcmp(buf, "md5") == 0){ 
			s->hf = md5; 
			s->diglen = MD5dlen; 
		} else if(strcmp(buf, "sha") == 0){ 
			s->hf = sha; 
			s->diglen = SHAdlen; 
		} else if(strcmp(buf, "descbc") == 0){ 
			s->encryptalg = DESCBC; 
			s->blocklen = 8; 
1995/1218    
		} else if(strcmp(buf, "desecb") == 0){ 
			s->encryptalg = DESECB; 
1995/1213    
			s->blocklen = 8; 
		} else 
			error(Ebadarg); 
		s->state = Fdwait; 
		break; 
	case Fdwait: 
		/* get communications channel */ 
		s->c = buftochan(a, n); 
		s->state = Secretinwait; 
		break; 
	case Secretinwait: 
		/* get secret for incoming messages */ 
1995/1218    
		setsecret(s, &s->in, a, n); 
1995/1213    
		s->state = Secretoutwait; 
		break; 
	case Secretoutwait: 
		/* get secret for outgoing messages */ 
1995/1218    
		setsecret(s, &s->out, a, n); 
1995/1213    
		if(s->blocklen != 1){ 
			s->max = (1<<15) - s->diglen; 
			s->max -= s->max % s->blocklen; 
			s->maxpad = (1<<14) - s->diglen; 
			s->maxpad -= s->maxpad % s->blocklen; 
		} else 
			s->maxpad = s->max = (1<<15) - s->diglen; 
		s->state = Established; 
		break; 
	case Established: 
1995/1218    
		p = a; 
		for(e = p + n; p < e; p += m){ 
			m = e - p; 
1995/1213    
			if(m > s->max) 
				m = s->max; 
	                 
			b = allocb(m); 
			if(waserror()){ 
				freeb(b); 
				nexterror(); 
			} 
1995/1218    
			memmove(b->wp, p, m); 
1995/1213    
			poperror(); 
			b->wp += m; 
	                 
			sslbwrite(c, b, offset); 
1995/1218    
		} 
1995/1213    
		break; 
	default: 
		error(Ebadusefd); 
1996/0223    
	if(waserror()){ 
		freeb(b); 
		nexterror(); 
1995/1213    
	} 
 
1996/0223    
	n = BLEN(b); 
	memmove(a, b->rp, n); 
	freeb(b); 
 
	poperror(); 
 
1995/1213    
	return n; 
} 
 
1996/0202/sys/src/9/port/devssl.c:483,4881996/0223/sys/src/9/port/devssl.c:390,487
1995/1215    
	poperror(); 
 
	return rv; 
1996/0223    
} 
 
long 
sslwrite(Chan *c, void *a, long n, ulong offset) 
{ 
	Dstate *s; 
	Block *b; 
	int m; 
	char *p, *e, buf[32]; 
 
	switch(c->qid.path & ~CHDIR){ 
	case Qclone: 
		break; 
	default: 
		error(Ebadusefd); 
	} 
 
	s = c->aux; 
	if(s == 0) 
		error(Ebadusefd); 
 
	switch(s->state){ 
	case Algwait: 
		/* get algorithm */ 
		if(n >= sizeof(buf)) 
			error(Ebadarg); 
		strncpy(buf, a, n); 
		buf[n] = 0; 
		s->blocklen = 1; 
		s->diglen = 0; 
		if(strcmp(buf, "md5") == 0){ 
			s->hf = md5; 
			s->diglen = MD5dlen; 
		} else if(strcmp(buf, "sha") == 0){ 
			s->hf = sha; 
			s->diglen = SHAdlen; 
		} else if(strcmp(buf, "descbc") == 0){ 
			s->encryptalg = DESCBC; 
			s->blocklen = 8; 
		} else if(strcmp(buf, "desecb") == 0){ 
			s->encryptalg = DESECB; 
			s->blocklen = 8; 
		} else 
			error(Ebadarg); 
		s->state = Fdwait; 
		break; 
	case Fdwait: 
		/* get communications channel */ 
		s->c = buftochan(a, n); 
		s->state = Secretinwait; 
		break; 
	case Secretinwait: 
		/* get secret for incoming messages */ 
		setsecret(s, &s->in, a, n); 
		s->state = Secretoutwait; 
		break; 
	case Secretoutwait: 
		/* get secret for outgoing messages */ 
		setsecret(s, &s->out, a, n); 
		if(s->blocklen != 1){ 
			s->max = (1<<15) - s->diglen; 
			s->max -= s->max % s->blocklen; 
			s->maxpad = (1<<14) - s->diglen; 
			s->maxpad -= s->maxpad % s->blocklen; 
		} else 
			s->maxpad = s->max = (1<<15) - s->diglen; 
		s->state = Established; 
		break; 
	case Established: 
		p = a; 
		for(e = p + n; p < e; p += m){ 
			m = e - p; 
			if(m > s->max) 
				m = s->max; 
	 
			b = allocb(m); 
			if(waserror()){ 
				freeb(b); 
				nexterror(); 
			} 
			memmove(b->wp, p, m); 
			poperror(); 
			b->wp += m; 
	 
			sslbwrite(c, b, offset); 
		} 
		break; 
	default: 
		error(Ebadusefd); 
	} 
 
	return n; 
1995/1213    
} 
 
/* 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)