diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-06-24 22:49:38 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-06-24 22:49:38 +0200 |
commit | 50eb678c72968cdd13b4edeb643840049dcb1442 (patch) | |
tree | f302484d3b7e7d0dc09e6ef907cf2e295af66ec4 /sys/src/cmd/aux/wpa.c | |
parent | 4da4785412451e2f2b1c75821beea64857c23771 (diff) |
wpa: deassociation, reply eapol version, send rsc 0 and reset install flag on message D reply, use 0 for txkey tsc
Diffstat (limited to 'sys/src/cmd/aux/wpa.c')
-rw-r--r-- | sys/src/cmd/aux/wpa.c | 50 |
1 files changed, 33 insertions, 17 deletions
diff --git a/sys/src/cmd/aux/wpa.c b/sys/src/cmd/aux/wpa.c index 8aaff4de5..1abca3a87 100644 --- a/sys/src/cmd/aux/wpa.c +++ b/sys/src/cmd/aux/wpa.c @@ -476,7 +476,7 @@ checkmic(Keydescr *kd, uchar *msg, int msglen) } void -reply(uchar smac[Eaddrlen], uchar amac[Eaddrlen], int flags, Keydescr *kd, uchar *data, int datalen) +reply(int eapver, uchar smac[Eaddrlen], uchar amac[Eaddrlen], int flags, Keydescr *kd, uchar *data, int datalen) { uchar buf[4096], *m, *p = buf; @@ -486,7 +486,7 @@ reply(uchar smac[Eaddrlen], uchar amac[Eaddrlen], int flags, Keydescr *kd, uchar *p++ = 0x8e; m = p; - *p++ = 0x01; + *p++ = eapver; *p++ = 0x03; datalen += Keydescrlen; *p++ = datalen >> 8; @@ -507,7 +507,7 @@ reply(uchar smac[Eaddrlen], uchar amac[Eaddrlen], int flags, Keydescr *kd, uchar if(flags & Fmic) calcmic(kd, m, p - m); if(debug != 0){ - fprint(2, "\nreply %E -> %E: ", smac, amac); + fprint(2, "\nreply(v%d) %E -> %E: ", eapver, smac, amac); dumpkeydescr(kd); } datalen = p - buf; @@ -636,12 +636,20 @@ main(int argc, char *argv[]) for(;;){ uchar smac[Eaddrlen], amac[Eaddrlen], snonce[Noncelen], anonce[Noncelen], *p, *e, *m; - int proto, flags, vers, datalen; + int proto, eapver, flags, vers, datalen; uvlong repc, rsc, tsc; Keydescr *kd; if((n = read(fd, buf, sizeof(buf))) < 0) sysfatal("read: %r"); + + if(n == 0){ + if(debug != 0) + fprint(2, "got deassociation\n"); + lastrepc = 0ULL; + continue; + } + p = buf; e = buf+n; if(n < 2*Eaddrlen + 2) @@ -654,18 +662,26 @@ main(int argc, char *argv[]) m = p; n = e - p; - if(n < 4 || (p[0] != 0x01 && p[0] != 0x02) || p[1] != 0x03) + if(n < 4) + continue; + eapver = p[0]; + if((eapver != 0x01 && eapver != 0x02) || p[1] != 0x03) continue; + + if(debug != 0) + fprint(2, "\nrecv(v%d) %E <- %E: ", eapver, smac, amac); + n = p[2]<<8 | p[3]; p += 4; - if(n < Keydescrlen || p + n > e) + if(n < Keydescrlen || p + n > e){ + if(debug != 0) + fprint(2, "bad kd size\n"); continue; + } e = p + n; kd = (Keydescr*)p; - if(debug){ - fprint(2, "\nrecv %E <- %E: ", smac, amac); + if(debug != 0) dumpkeydescr(kd); - } if(kd->type[0] != 0xFE && kd->type[0] != 0x02) continue; @@ -682,14 +698,17 @@ main(int argc, char *argv[]) memmove(anonce, kd->nonce, sizeof(anonce)); genrandom(snonce, sizeof(snonce)); - if(getptk(smac, amac, snonce, anonce, ptk) < 0) + if(getptk(smac, amac, snonce, anonce, ptk) < 0){ + if(debug != 0) + fprint(2, "getptk: %r"); continue; + } /* ack key exchange with mic */ memset(kd->rsc, 0, sizeof(kd->rsc)); memset(kd->eapoliv, 0, sizeof(kd->eapoliv)); memmove(kd->nonce, snonce, sizeof(kd->nonce)); - reply(smac, amac, (flags & ~(Fack|Fins)) | Fmic, kd, rsne, rsnelen); + reply(eapver, smac, amac, (flags & ~(Fack|Fins)) | Fmic, kd, rsne, rsnelen); } else { uchar gtk[GTKlen]; int gtklen, gtkkid; @@ -781,14 +800,11 @@ main(int argc, char *argv[]) peercipher->name, peercipher->keylen, ptk+32, tsc) < 0) sysfatal("write rxkey: %r"); - /* pick random 16bit tsc value for transmit */ - tsc = 1 + (truerand() & 0x7fff); + tsc = 0LL; memset(kd->rsc, 0, sizeof(kd->rsc)); - kd->rsc[0] = tsc; - kd->rsc[1] = tsc>>8; memset(kd->eapoliv, 0, sizeof(kd->eapoliv)); memset(kd->nonce, 0, sizeof(kd->nonce)); - reply(smac, amac, flags & ~(Fack|Fenc|Fsec), kd, nil, 0); + reply(eapver, smac, amac, flags & ~(Fack|Fenc|Fins), kd, nil, 0); sleep(100); /* install pairwise transmit key */ @@ -811,7 +827,7 @@ main(int argc, char *argv[]) memset(kd->rsc, 0, sizeof(kd->rsc)); memset(kd->eapoliv, 0, sizeof(kd->eapoliv)); memset(kd->nonce, 0, sizeof(kd->nonce)); - reply(smac, amac, flags & ~(Fenc|Fack), kd, nil, 0); + reply(eapver, smac, amac, flags & ~(Fenc|Fack), kd, nil, 0); } else continue; |