From b08bef5d6a5d311f5739ec2d6284a7c845bb1139 Mon Sep 17 00:00:00 2001 From: wpaul Date: Thu, 21 Sep 2000 00:25:07 +0000 Subject: Fix PR #21245: handle wep keys correctly and pretty print hex keys as appropriate. Nick: this sort of does what your changes did, except the hex/text printing is done automatically using isprint(). --- usr.sbin/wicontrol/wicontrol.8 | 12 +++----- usr.sbin/wicontrol/wicontrol.c | 66 ++++++++++++++++++++++++------------------ 2 files changed, 42 insertions(+), 36 deletions(-) (limited to 'usr.sbin/wicontrol') diff --git a/usr.sbin/wicontrol/wicontrol.8 b/usr.sbin/wicontrol/wicontrol.8 index c83e537..4f94a49 100644 --- a/usr.sbin/wicontrol/wicontrol.8 +++ b/usr.sbin/wicontrol/wicontrol.8 @@ -244,14 +244,10 @@ can either be normal text (i.e. "hello") or a series of hexadecimal digits (i.e. "0x1234512345"). For WaveLAN Turbo Silver cards, the key is restricted to 40 bits, hence the key can be either a 5 character text string or 10 hex digits. -For WaveLAN Turbo Gold cards, the key can be up to 128 bits, -which means the key can be specified as either a 16 character text -string or 32 hex digits. -.Pp -Note: currently, the field in the structure used to program the key -into the NIC is only 14 bytes long, not 16. -I'm not sure how this is -supposed to allow 128 bits of key info for the gold cards. +For WaveLAN Turbo Gold cards, the key can also be 104 bits, +which means the key can be specified as either a 13 character text +string or 26 hex digits in addition to the formats supported by the +Silver cards. .It Fl i Ar iface Fl T Ar 1|2|3|4 Specify which of the four WEP encryption keys will be used to encrypt transmitted packets. diff --git a/usr.sbin/wicontrol/wicontrol.c b/usr.sbin/wicontrol/wicontrol.c index 7ab2335..fbd81a3 100644 --- a/usr.sbin/wicontrol/wicontrol.c +++ b/usr.sbin/wicontrol/wicontrol.c @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -69,9 +70,9 @@ static void wi_sethex __P((char *, int, char *)); static void wi_printwords __P((struct wi_req *)); static void wi_printbool __P((struct wi_req *)); static void wi_printhex __P((struct wi_req *)); -static void wi_dumpinfo __P((char *, char)); +static void wi_dumpinfo __P((char *)); static void wi_setkeys __P((char *, char *, int)); -static void wi_printkeys __P((struct wi_req *, char)); +static void wi_printkeys __P((struct wi_req *)); static void usage __P((char *)); static void wi_getval(iface, wreq) @@ -282,6 +283,7 @@ static void wi_setkeys(iface, key, idx) char *key; int idx; { + int keylen; struct wi_req wreq; struct wi_ltv_keys *keys; struct wi_key *k; @@ -292,7 +294,7 @@ static void wi_setkeys(iface, key, idx) wi_getval(iface, &wreq); if (wreq.wi_val[0] == 0) - err(1, "no WEP option available on this card"); + errx(1, "no WEP option available on this card"); bzero((char *)&wreq, sizeof(wreq)); wreq.wi_len = WI_MAX_DATALEN; @@ -301,13 +303,21 @@ static void wi_setkeys(iface, key, idx) wi_getval(iface, &wreq); keys = (struct wi_ltv_keys *)&wreq; - if (strlen(key) > 14) { - err(1, "encryption key must be no " - "more than 14 characters long"); + keylen = strlen(key); + if (key[0] == '0' && (key[1] == 'x' || key[1] == 'X')) { + if(keylen != 2 && keylen != 12 && keylen != 28) { + errx(1, "encryption key must be 0, 10, or 26 " + "hex digits long"); + } + } else { + if (keylen != 0 && keylen != 5 && keylen != 13) { + errx(1, "encryption key must be 0, 5, or 13 " + "bytes long"); + } } if (idx > 3) - err(1, "only 4 encryption keys available"); + errx(1, "only 4 encryption keys available"); k = &keys->wi_keys[idx]; wi_str2key(key, k); @@ -319,34 +329,37 @@ static void wi_setkeys(iface, key, idx) return; } -static void wi_printkeys(wreq, asciikeys) +static void wi_printkeys(wreq) struct wi_req *wreq; - char asciikeys; { int i, j; + int isprintable; struct wi_key *k; struct wi_ltv_keys *keys; - unsigned char *ptr; + char *ptr; keys = (struct wi_ltv_keys *)wreq; for (i = 0; i < 4; i++) { k = &keys->wi_keys[i]; ptr = (char *)k->wi_keydat; - if (asciikeys) { - for (j = 0; j < k->wi_keylen; j++) { - if (ptr[j] == '\0') - ptr[j] = ' '; + isprintable = 1; + for (j = 0; j < k->wi_keylen; j++) { + if (!isprint(ptr[j])) { + isprintable = 0; + break; } + } + if(isprintable) { ptr[j] = '\0'; printf("[ %s ]", ptr); } else { - printf("[ "); - if (k->wi_keylen) - printf("0x"); - for (j = 0; j < k->wi_keylen; j++) - printf("%02x",ptr[j]); + printf("[ 0x"); + for (j = 0; j < k->wi_keylen; j++) { + printf("%02x", ptr[j] & 0xFF); + } printf(" ]"); + } } @@ -439,8 +452,8 @@ static struct wi_table wi_crypt_table[] = { { 0, NULL } }; -static void wi_dumpinfo(iface, asciikeys) - char *iface,asciikeys; +static void wi_dumpinfo(iface) + char *iface; { struct wi_req wreq; int i, has_wep; @@ -509,7 +522,7 @@ static void wi_dumpinfo(iface, asciikeys) wi_printhex(&wreq); break; case WI_KEYSTRUCT: - wi_printkeys(&wreq, asciikeys); + wi_printkeys(&wreq); break; default: break; @@ -682,10 +695,10 @@ int main(argc, argv) char *iface = NULL; char *p = argv[0]; char *key = NULL; - int modifier = 0, show_ascii_keys = 0; + int modifier = 0; while((ch = getopt(argc, argv, - "ahoc:d:e:f:i:k:p:r:q:t:n:s:m:v:P:S:T:ZC")) != -1) { + "hoc:d:e:f:i:k:p:r:q:t:n:s:m:v:P:S:T:ZC")) != -1) { switch(ch) { case 'Z': #ifdef WICACHE @@ -710,9 +723,6 @@ int main(argc, argv) case 'i': iface = optarg; break; - case 'a': - show_ascii_keys++; - break; case 'c': wi_setword(iface, WI_RID_CREATE_IBSS, atoi(optarg)); exit(0); @@ -792,7 +802,7 @@ int main(argc, argv) exit(0); } - wi_dumpinfo(iface,show_ascii_keys); + wi_dumpinfo(iface); exit(0); } -- cgit v1.1