ref: 72be22cd3ad8236dba47d3c56d1ba8af5b16a1c2
parent: a342e5ac5d5bda2efb66fb9a29d2e7f72aba688d
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Tue Jan 27 09:09:24 EST 2015
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.
--- a/sys/src/cmd/aux/wpa.c
+++ b/sys/src/cmd/aux/wpa.c
@@ -117,6 +117,7 @@
uchar wpa1oui[4] = {0x00, 0x50, 0xF2, 0x01};
uchar wpatkipoui[4] = {0x00, 0x50, 0xF2, 0x02};
uchar wpaapskoui[4] = {0x00, 0x50, 0xF2, 0x02};
+uchar wpaawpaoui[4] = {0x00, 0x50, 0xF2, 0x01};
uchar wpaie[] = {
0xdd, /* vendor specific */
@@ -352,8 +353,14 @@
break;
}
} else {
+ /* look for PSK oui */
if(memcmp(p, wpaapskoui, 4) == 0)
break;
+ /* look for WPA oui */
+ if(memcmp(p, wpaawpaoui, 4) == 0){
+ ispsk = 0;
+ break;
+ }
}
p += 4;
}
@@ -1054,23 +1061,21 @@
int
avp(uchar *p, int n, int code, void *val, int len, int pad)
{
- len += 8;
- if(len > n){
- len = n - 8;
- pad = 0;
- }
+ pad = 8 + ((len + pad) & ~pad); /* header + data + data pad */
+ assert(((pad + 3) & ~3) <= n);
p[0] = code >> 24;
p[1] = code >> 16;
p[2] = code >> 8;
p[3] = code;
p[4] = 2;
- p[5] = len >> 16;
- p[6] = len >> 8;
- p[7] = len;
- memmove(p+8, val, len-8);
- n = (len + pad) & ~pad;
- memset(p + len, 0, n - len);
- return n;
+ p[5] = pad >> 16;
+ p[6] = pad >> 8;
+ p[7] = pad;
+ memmove(p+8, val, len);
+ len += 8;
+ pad = (pad + 3) & ~3; /* packet padding */
+ memset(p+len, 0, pad - len);
+ return pad;
}
enum {
@@ -1091,7 +1096,7 @@
fd = tlswrap(fd, "ttls keying material");
if((up = auth_getuserpasswd(nil, "proto=pass service=wpa essid=%q", essid)) == nil)
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);
freeup(up);
write(fd, buf, n);