diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-01-06 03:09:00 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-01-06 03:09:00 +0100 |
commit | 2dae1ed53a73d81bfb86778793a6bda265d5140d (patch) | |
tree | e037c4a663fc9d17906cc2045c488232ac223ece /sys/src/libauthsrv/convM2T.c | |
parent | e064752dd476b7a2f76567f8cc15f9c2645e5d3d (diff) |
auth: release dp9ik implementation and reentrant factotum
Diffstat (limited to 'sys/src/libauthsrv/convM2T.c')
-rw-r--r-- | sys/src/libauthsrv/convM2T.c | 60 |
1 files changed, 38 insertions, 22 deletions
diff --git a/sys/src/libauthsrv/convM2T.c b/sys/src/libauthsrv/convM2T.c index 425ebefdd..cfe97b734 100644 --- a/sys/src/libauthsrv/convM2T.c +++ b/sys/src/libauthsrv/convM2T.c @@ -2,34 +2,50 @@ #include <libc.h> #include <authsrv.h> -#define CHAR(x) f->x = *p++ -#define SHORT(x) f->x = (p[0] | (p[1]<<8)); p += 2 -#define VLONG(q) q = (p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24)); p += 4 -#define LONG(x) VLONG(f->x) -#define STRING(x,n) memmove(f->x, p, n); p += n +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 *key) +convM2T(char *ap, int n, Ticket *f, Authkey *k) { - uchar *p, buf[TICKETLEN]; + uchar buf[MAXTICKETLEN], *p; + int m; - memset(f, 0, sizeof(Ticket)); - if(n < TICKETLEN) - return -TICKETLEN; + if(f != nil) + memset(f, 0, sizeof(Ticket)); - if(key){ - memmove(buf, ap, TICKETLEN); - ap = (char*)buf; - decrypt(key->des, ap, TICKETLEN); + 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 = (uchar*)ap; - CHAR(num); - STRING(chal, CHALLEN); - STRING(cuid, ANAMELEN); + 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; - STRING(suid, ANAMELEN); f->suid[ANAMELEN-1] = 0; - STRING(key, DESKEYLEN); - n = p - (uchar*)ap; - return n; + + return m; } |