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/convM2A.c | |
parent | e064752dd476b7a2f76567f8cc15f9c2645e5d3d (diff) |
auth: release dp9ik implementation and reentrant factotum
Diffstat (limited to 'sys/src/libauthsrv/convM2A.c')
-rw-r--r-- | sys/src/libauthsrv/convM2A.c | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/sys/src/libauthsrv/convM2A.c b/sys/src/libauthsrv/convM2A.c index b0d6712ca..0da7865fe 100644 --- a/sys/src/libauthsrv/convM2A.c +++ b/sys/src/libauthsrv/convM2A.c @@ -2,30 +2,35 @@ #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 form1M2B(char *ap, int n, uchar key[32]); int convM2A(char *ap, int n, Authenticator *f, Ticket *t) { - uchar *p, buf[AUTHENTLEN]; + uchar buf[MAXAUTHENTLEN], *p; + int m; memset(f, 0, sizeof(Authenticator)); - if(n < AUTHENTLEN) - return -AUTHENTLEN; - - if(t) { - memmove(buf, ap, AUTHENTLEN); - ap = (char*)buf; - decrypt(t->key, ap, AUTHENTLEN); + if(t->form == 0){ + m = 1+CHALLEN+4; + if(n < m) + return -m; + memmove(buf, ap, m); + decrypt(t->key, buf, m); + } else { + m = 12+CHALLEN+NONCELEN+16; + if(n < m) + return -m; + memmove(buf, ap, m); + if(form1M2B((char*)buf, m, t->key) < 0) + return m; } - p = (uchar*)ap; - CHAR(num); - STRING(chal, CHALLEN); - LONG(id); - n = p - (uchar*)ap; - return n; + p = buf; + f->num = *p++; + memmove(f->chal, p, CHALLEN); + p += CHALLEN; + if(t->form == 1) + memmove(f->rand, p, NONCELEN); + + return m; } |