Yaroslav Kolomiietsreplace byte macros with functions0cf43c39 years agoHistory
153 lines · 2.6 KB · C
RawDownload
/* * [MS-RDPELE] 2.2.2 Licensing PDU (TS_LICENSING_PDU) * http://msdn.microsoft.com/en-us/library/cc241913.aspx * * 2.2.1.12.1.1 Licensing Preamble [MS-RDPBCGR] * 2.2.1.12.1.2 Licensing Binary Blob [MS-RDPBCGR] * 2.2.2.2 Client New License Request [MS-RDPELE] */#include <u.h>#include <libc.h>#include "dat.h"#include "fns.h" enum{	RandomSize=	32, 	PreambleV3=	3,	/* RDP 5.0+ */	KeyExRSA=	1, 	SNeedLicense=	1,	SHaveChal=	2,	SHaveLicense=	3,	SNeedRenew=	4, 	CNeedLicense=	0x13,	Notify=	0xFF, 	Brandom=	2,	Berror=	4,	Bcuser=	15,	Bchost=	16, 	ErrCNoLicense=	2, 	TotalAbort=	1,	NoTransition=	2,}; intgetlicensemsg(Msg* m, uchar* b, uint nb){	uint type; 	if(nb < 1)		sysfatal(Eshort); 	/* type[1] flags[1] size[2] */	type = b[0];	switch(type){	default:		werrstr("unhandled license packet %ud", type);		m->type = 0;		return -1;	case SNeedLicense:		m->type = Lneedlicense;		break;	case SHaveChal:		m->type = Lhavechal;		break;	case SNeedRenew:	case SHaveLicense:	case Notify:		m->type = Ldone;		break;	}	return nb;} intsizelicensemsg(Msg* m){	int usersize, hostsize; 	switch(m->type){	default:		werrstr("sizelicensemsg: bad message type");		return -1;	case Lreq:		usersize = strlen(m->user)+1;		hostsize = strlen(m->sysname)+1;		return 24+usersize+hostsize+RandomSize+48;		break;	case Lnolicense:		return 16;	}} intputlicensemsg(uchar* buf, uint nb, Msg* m){	uchar *p, *ep;	int ndata, usersize, hostsize;	int errcode, newstate; 	p = buf;	ep = buf+nb;	ndata = nb; 	switch(m->type){	default:		werrstr("putlicensemsg: bad message type");		return -1;	case Lreq:			usersize = strlen(m->user)+1;		hostsize = strlen(m->sysname)+1; 		/* 		 * type[1] flags[1] size[2] kexalg[4] platfid[4] crandom[32]		 * premaster[blob] cuser[blob] chost[blob]		 * (blob := type[2] len[2] data[len])		 */		p[0] = CNeedLicense;		p[1] = PreambleV3;		iputs(p+2, ndata);		iputl(p+4, KeyExRSA);		iputl(p+8, 0);		memset(p+12, RandomSize, 0);		p += 12+RandomSize;			iputs(p+0, Brandom);		iputs(p+2, 48);		memset(p+4, 48, 0);		p += 4+48; 		iputs(p+0, Bcuser);		iputs(p+2, usersize);		memcpy(p+4, m->user, usersize);		p+= 4+usersize;			iputs(p+0, Bchost);		iputs(p+2, hostsize);		memcpy(p+4, m->sysname, hostsize);		p+= 4+hostsize;		break; 	case Lnolicense:		errcode = ErrCNoLicense;		newstate = TotalAbort; 		/* type[1] flags[1] size[2] errcode[4] newstate[4] blob.type[2] blob.len[2] ... */		p[0] = Notify;		p[1] = PreambleV3;		iputs(p+2, ndata);		iputl(p+4, errcode);		iputl(p+8, newstate);		iputs(p+12, Berror);		iputs(p+14, 0);		break;	}	assert(p == ep);	return p-buf;}