summaryrefslogtreecommitdiff
path: root/sys/src/libauthsrv/convM2T.c
blob: cfe97b73439bfb3f69b601723d9fa0a413f43420 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <u.h>
#include <libc.h>
#include <authsrv.h>

extern int form1check(char *ap, int n);
extern int form1M2B(char *ap, int n, uchar key[32]);

int
convM2T(char *ap, int n, Ticket *f, Authkey *k)
{
	uchar buf[MAXTICKETLEN], *p;
	int m;

	if(f != nil)
		memset(f, 0, sizeof(Ticket));

	if(n < 8)
		return -8;

	if(form1check(ap, n) < 0){
		m = 1+CHALLEN+2*ANAMELEN+DESKEYLEN;
		if(n < m)
			return -m;
		if(f == nil || k == nil)
			return m;
		f->form = 0;
		memmove(buf, ap, m);
		decrypt(k->des, buf, m);
	} else {
		m = 12+CHALLEN+2*ANAMELEN+NONCELEN+16;
		if(n < m)
			return -m;
		if(f == nil || k == nil)
			return m;
		f->form = 1;
		memmove(buf, ap, m);
		if(form1M2B((char*)buf, m, k->pakkey) < 0)
			return m;
	}
	p = buf;
	f->num = *p++;
	memmove(f->chal, p, CHALLEN), p += CHALLEN;
	memmove(f->cuid, p, ANAMELEN), p += ANAMELEN;
	memmove(f->suid, p, ANAMELEN), p += ANAMELEN;
	memmove(f->key, p, f->form == 0 ? DESKEYLEN : NONCELEN);

	f->cuid[ANAMELEN-1] = 0;
	f->suid[ANAMELEN-1] = 0;

	return m;
}