wpa: fix password avp padding, recognize wpa1 authentication oui

we have to padd the data portion in the password avp,
not add padding after the avp.
This commit is contained in:
cinap_lenrek 2015-01-27 14:09:24 +01:00
parent a342e5ac5d
commit 72be22cd3a

View file

@ -117,6 +117,7 @@ uchar rsnie[] = {
uchar wpa1oui[4] = {0x00, 0x50, 0xF2, 0x01}; uchar wpa1oui[4] = {0x00, 0x50, 0xF2, 0x01};
uchar wpatkipoui[4] = {0x00, 0x50, 0xF2, 0x02}; uchar wpatkipoui[4] = {0x00, 0x50, 0xF2, 0x02};
uchar wpaapskoui[4] = {0x00, 0x50, 0xF2, 0x02}; uchar wpaapskoui[4] = {0x00, 0x50, 0xF2, 0x02};
uchar wpaawpaoui[4] = {0x00, 0x50, 0xF2, 0x01};
uchar wpaie[] = { uchar wpaie[] = {
0xdd, /* vendor specific */ 0xdd, /* vendor specific */
@ -352,8 +353,14 @@ trunc: sysfatal("invalid or truncated RSNE; brsne: %s", buf);
break; break;
} }
} else { } else {
/* look for PSK oui */
if(memcmp(p, wpaapskoui, 4) == 0) if(memcmp(p, wpaapskoui, 4) == 0)
break; break;
/* look for WPA oui */
if(memcmp(p, wpaawpaoui, 4) == 0){
ispsk = 0;
break;
}
} }
p += 4; p += 4;
} }
@ -1054,23 +1061,21 @@ eapreq(Eapconn *conn, int code, int id, uchar *data, int datalen)
int int
avp(uchar *p, int n, int code, void *val, int len, int pad) avp(uchar *p, int n, int code, void *val, int len, int pad)
{ {
len += 8; pad = 8 + ((len + pad) & ~pad); /* header + data + data pad */
if(len > n){ assert(((pad + 3) & ~3) <= n);
len = n - 8;
pad = 0;
}
p[0] = code >> 24; p[0] = code >> 24;
p[1] = code >> 16; p[1] = code >> 16;
p[2] = code >> 8; p[2] = code >> 8;
p[3] = code; p[3] = code;
p[4] = 2; p[4] = 2;
p[5] = len >> 16; p[5] = pad >> 16;
p[6] = len >> 8; p[6] = pad >> 8;
p[7] = len; p[7] = pad;
memmove(p+8, val, len-8); memmove(p+8, val, len);
n = (len + pad) & ~pad; len += 8;
memset(p + len, 0, n - len); pad = (pad + 3) & ~3; /* packet padding */
return n; memset(p+len, 0, pad - len);
return pad;
} }
enum { enum {
@ -1091,7 +1096,7 @@ ttlsclient(int fd)
fd = tlswrap(fd, "ttls keying material"); fd = tlswrap(fd, "ttls keying material");
if((up = auth_getuserpasswd(nil, "proto=pass service=wpa essid=%q", essid)) == nil) if((up = auth_getuserpasswd(nil, "proto=pass service=wpa essid=%q", essid)) == nil)
sysfatal("auth_getuserpasswd: %r"); sysfatal("auth_getuserpasswd: %r");
n = avp(buf, sizeof(buf), AvpUserName, up->user, strlen(up->user), 3); n = avp(buf, sizeof(buf), AvpUserName, up->user, strlen(up->user), 0);
n += avp(buf+n, sizeof(buf)-n, AvpUserPass, up->passwd, strlen(up->passwd), 15); n += avp(buf+n, sizeof(buf)-n, AvpUserPass, up->passwd, strlen(up->passwd), 15);
freeup(up); freeup(up);
write(fd, buf, n); write(fd, buf, n);