summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-03-23 22:09:46 +0100
committercinap_lenrek <cinap_lenrek@gmx.de>2013-03-23 22:09:46 +0100
commit34e46d083738551b2b396953f86b110e84392ff5 (patch)
tree4548d85deb1d44978d70a0a07229a19b830b46de
parent66a3ffe2489727e85462e60e6dcec5dad1f5b20d (diff)
downloadplan9front-34e46d083738551b2b396953f86b110e84392ff5.tar.xz
wpa: fix rsc for wpa2
in wpa2, the rsc field of the eapol message3 is the packet number for *group* messages that the ap will use as there is no separate group key message. in wpa1, we use it for the peerwise key.
-rw-r--r--sys/src/cmd/aux/wpa.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/sys/src/cmd/aux/wpa.c b/sys/src/cmd/aux/wpa.c
index 3dee4b74b..f3dacc71c 100644
--- a/sys/src/cmd/aux/wpa.c
+++ b/sys/src/cmd/aux/wpa.c
@@ -438,7 +438,7 @@ main(int argc, char *argv[])
for(;;){
uchar smac[Eaddrlen], amac[Eaddrlen], snonce[Noncelen], anonce[Noncelen], *p, *e, *m;
int proto, flags, vers, datalen;
- uvlong repc, rsc;
+ uvlong repc, rsc, tsc;
Keydescr *kd;
if((n = read(fd, buf, sizeof(buf))) < 0)
@@ -471,13 +471,6 @@ main(int argc, char *argv[])
if(kd->type[0] != 0xFE && kd->type[0] != 0x02)
continue;
- rsc = (uvlong)kd->rsc[0] |
- (uvlong)kd->rsc[1]<<8 |
- (uvlong)kd->rsc[2]<<16 |
- (uvlong)kd->rsc[3]<<24 |
- (uvlong)kd->rsc[4]<<32 |
- (uvlong)kd->rsc[5]<<40;
-
vers = kd->flags[1] & 7;
flags = kd->flags[0]<<8 | kd->flags[1];
datalen = kd->datalen[0]<<8 | kd->datalen[1];
@@ -523,6 +516,13 @@ main(int argc, char *argv[])
}
lastrepc = repc;
+ rsc = (uvlong)kd->rsc[0] |
+ (uvlong)kd->rsc[1]<<8 |
+ (uvlong)kd->rsc[2]<<16 |
+ (uvlong)kd->rsc[3]<<24 |
+ (uvlong)kd->rsc[4]<<32 |
+ (uvlong)kd->rsc[5]<<40;
+
if(datalen > 0 && (flags & Fenc) != 0){
if(vers == 1)
datalen = rc4unwrap(ptk+16, kd->eapoliv, kd->data, datalen);
@@ -571,16 +571,22 @@ main(int argc, char *argv[])
}
if((flags & (Fptk|Fack)) == (Fptk|Fack)){
+ if(vers != 1) /* in WPA2, RSC is for group key only */
+ tsc = 0LL;
+ else {
+ tsc = rsc;
+ rsc = 0LL;
+ }
/* install peerwise receive key */
if(fprint(cfd, "rxkey %.*H %s:%.*H@%llux", Eaddrlen, amac,
- peercipher->name, peercipher->keylen, ptk+32, rsc) < 0)
+ peercipher->name, peercipher->keylen, ptk+32, tsc) < 0)
sysfatal("write rxkey: %r");
/* pick random 16bit tsc value for transmit */
- rsc = 1 + (truerand() & 0x7fff);
+ tsc = 1 + (truerand() & 0x7fff);
memset(kd->rsc, 0, sizeof(kd->rsc));
- kd->rsc[0] = rsc;
- kd->rsc[1] = rsc>>8;
+ 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);
@@ -588,11 +594,8 @@ main(int argc, char *argv[])
/* install peerwise transmit key */
if(fprint(cfd, "txkey %.*H %s:%.*H@%llux", Eaddrlen, amac,
- peercipher->name, peercipher->keylen, ptk+32, rsc) < 0)
+ peercipher->name, peercipher->keylen, ptk+32, tsc) < 0)
sysfatal("write txkey: %r");
-
- /* reset rsc for group key */
- rsc = 0;
} else
if((flags & (Fptk|Fsec|Fack)) == (Fsec|Fack)){
if(kd->type[0] == 0xFE){