Copy Makefile and wpakey.c from madwifi-dfs branch

git-svn-id: http://madwifi-project.org/svn/madwifi/trunk@3685 0192ed92-7a03-0410-a25b-9323aeb14dbd
This commit is contained in:
proski 2008-05-30 19:52:53 +00:00
parent 0b5e419a35
commit 4cf35af407
2 changed files with 355 additions and 14 deletions

View File

@ -43,20 +43,26 @@ ATH_HAL = $(TOP)/ath_hal
# Path to the HAL source code.
#
ifeq ($(HAL),)
HAL= $(TOP)/hal
HAL = $(TOP)/hal
endif
ALL= athstats 80211stats athkey athchans athctrl \
athdebug 80211debug wlanconfig
PROGRAMS = athstats 80211stats athkey athchans athctrl \
athdebug 80211debug wlanconfig wpakey
.PHONY: all
all: $(ALL)
SUBDIRS = ath_info
INCS= -I. -I$(HAL) -I$(TOP) -I$(ATH_HAL)
CFLAGS= -g -O2 -Wall
ALL_CFLAGS= $(CFLAGS) $(INCS)
LDFLAGS=
INCS = -I. -I$(HAL) -I$(TOP) -I$(ATH_HAL)
CFLAGS = -g -O2 -Wall
ALL_CFLAGS = $(CFLAGS) $(INCS)
LDFLAGS =
all: all-subdirs $(PROGRAMS)
all-subdirs:
for d in $(SUBDIRS); do \
$(MAKE) -C $$d || exit 1; \
done
athstats: athstats.c
$(CC) -o athstats $(ALL_CFLAGS) -I$(TOP)/ath $(LDFLAGS) athstats.c
@ -74,10 +80,10 @@ wlanconfig: wlanconfig.c
$(CC) -o wlanconfig $(ALL_CFLAGS) $(LDFLAGS) wlanconfig.c
80211debug: 80211debug.c
$(CC) -o 80211debug $(ALL_CFLAGS) $(LDFLAGS) 80211debug.c
wpakey: wpakey.c
$(CC) -o wpakey $(ALL_CFLAGS) $(LDFLAGS) wpakey.c
.PHONY: install
install: $(ALL)
install: all
install -d $(DESTDIR)$(BINDIR)
for i in $(ALL); do \
install $$i $(DESTDIR)$(BINDIR)/$$i; \
@ -86,8 +92,10 @@ install: $(ALL)
install -d $(DESTDIR)$(MANDIR)/man8
install -m 0644 man/*.8 $(DESTDIR)$(MANDIR)/man8
install $(TOP)/scripts/madwifi-unload $(DESTDIR)$(BINDIR)/madwifi-unload
for d in $(SUBDIRS); do \
$(MAKE) -C $$d install || exit 1; \
done
.PHONY: uninstall
uninstall:
for i in $(ALL); do \
rm -f $(DESTDIR)$(BINDIR)/$$i; \
@ -95,7 +103,14 @@ uninstall:
for i in $(ALL:=.8); do \
rm -f $(DESTDIR)$(MANDIR)/man8/$$i; \
done
for d in $(SUBDIRS); do \
$(MAKE) -C $$d uninstall || exit 1; \
done
.PHONY: clean
clean:
rm -f $(ALL) core a.out
for d in $(SUBDIRS); do \
$(MAKE) -C $$d clean; \
done
.PHONY: all all-subdirs clean install uninstall

326
tools/wpakey.c Normal file
View File

@ -0,0 +1,326 @@
/** WEP/WPA key setting tool for MadWifi driver, version 0.5
*
* (C) 2008-03-28 Georg Lukas <georg@madwifi.org>
*
* This program can be used to debug the MadWifi Key Cache. Use with caution
* and without warranty!
*
* Instructions:
*
* gcc -I/usr/src/madwifi-ng -Wall wpakey.c -o wpakey
* ./wpakey -h
*
* This code is published under the GNU General Public Licence v2.
*/
#include "wireless_copy.h"
#include <include/compat.h>
#include <net80211/ieee80211_ioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/ioctl.h>
#define MACS "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx"
#define MACP(mac) (mac)[0], (mac)[1], (mac)[2], (mac)[3], (mac)[4], (mac)[5]
char *dev = "ath0";
int sock;
int warn_wpa = 1;
int parse_mac(uint8_t *mac, const char *str)
{
if (sscanf(str, MACS,
&mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]
) < 6) {
fprintf(stderr, "Invalid MAC address at \"%s\"\n", str);
return 0;
} else {
return 1;
}
}
void hexdump(unsigned char *data, ssize_t dlen) {
//printf("%s: (%i) ", prefix, dlen);
while (dlen-- > 0) {
printf("%02hhx", *data++);
}
}
int set80211param(int op, int arg) {
struct iwreq iwr;
memset(&iwr, 0, sizeof(iwr));
strncpy(iwr.ifr_name, dev, IFNAMSIZ);
iwr.u.mode = op;
memcpy(iwr.u.name+4, &arg, 4);
if (ioctl(sock, IEEE80211_IOCTL_SETPARAM, &iwr) < 0) {
perror("ioctl(setparam)");
return -1;
}
return 0;
}
int get80211param(int op) {
struct iwreq iwr;
memset(&iwr, 0, sizeof(iwr));
strncpy(iwr.ifr_name, dev, IFNAMSIZ);
iwr.u.mode = op;
if (ioctl(sock, IEEE80211_IOCTL_GETPARAM, &iwr) < 0) {
perror("ioctl(getparam)");
return -1;
}
return iwr.u.mode;
}
int set80211priv(int op, void *data, int len) {
struct iwreq iwr;
memset(&iwr, 0, sizeof(iwr));
strncpy(iwr.ifr_name, dev, IFNAMSIZ);
iwr.u.data.pointer = data;
iwr.u.data.length = len;
if (ioctl(sock, op, &iwr) < 0) {
perror("ioctl()");
return -1;
}
return iwr.u.data.length;
}
void prep_key(struct ieee80211req_key *wk, int keyidx, uint8_t *mac) {
memset(wk, 0, sizeof(struct ieee80211req_key));
wk->ik_keyix = keyidx;
if (keyidx == IEEE80211_KEYIX_NONE) {
memcpy(wk->ik_macaddr, mac, 6);
}
}
char *cipherstrs[] = { "WEP", "TKIP", "OCB", "CCMP", "invalid", "CKIP", "none" };
char *strcipher(int c) {
if (c > IEEE80211_CIPHER_NONE) return "invalid";
return cipherstrs[c];
}
char *strflags(int f) {
static char buf[5];
char *ff = buf;
memset(buf, 0, sizeof(buf));
if (f & IEEE80211_KEY_RECV) *ff++ = 'R';
if (f & IEEE80211_KEY_XMIT) *ff++ = 'T';
if (f & IEEE80211_KEY_DEFAULT) *ff++ = 'D';
if (f & IEEE80211_KEY_GROUP) *ff++ = 'G';
*ff = '\0';
return buf;
}
int getkey(int keyidx, uint8_t *mac, int verbose) {
struct ieee80211req_key wk;
if (warn_wpa && get80211param(IEEE80211_PARAM_WPA) == 0) {
printf("WARNING: WPA is disabled!\n");
warn_wpa = 0;
}
prep_key(&wk, keyidx, mac);
if (set80211priv(IEEE80211_IOCTL_GETKEY, &wk, sizeof(wk)) >= 0) {
if (verbose == 0 && wk.ik_type == IEEE80211_CIPHER_NONE && wk.ik_keylen == 0)
return 0;
printf("Key %4x: <" MACS "> ", wk.ik_keyix, MACP(wk.ik_macaddr));
if (wk.ik_type == IEEE80211_CIPHER_NONE && wk.ik_flags == 3 && wk.ik_keylen == 0) {
printf("off\n");
} else {
printf("c=%-4s f=%-4s k<%-2i>=", strcipher(wk.ik_type),
strflags(wk.ik_flags), wk.ik_keylen);
hexdump(wk.ik_keydata, wk.ik_keylen);
printf(" rs=%lld ts=%lld\n", (long long)wk.ik_keyrsc,
(long long)wk.ik_keytsc);
}
return 0;
}
return -1;
}
int delkey(int keyidx, uint8_t *mac) {
struct ieee80211req_key wk;
prep_key(&wk, keyidx, mac);
return set80211priv(IEEE80211_IOCTL_DELKEY, &wk, sizeof(wk));
}
int setkey(int keyidx, uint8_t *mac, int type, int flags, int keylen, char *key) {
struct ieee80211req_key wk;
prep_key(&wk, keyidx, mac);
wk.ik_type = type;
wk.ik_flags = flags;
wk.ik_keylen = keylen;
memcpy(wk.ik_keydata, key, keylen);
return set80211priv(IEEE80211_IOCTL_SETKEY, &wk, sizeof(wk));
}
void iter_sta() {
uint8_t buf[24*1024];
uint8_t *bufpos;
ssize_t len;
if ((len = set80211priv(IEEE80211_IOCTL_STA_INFO, buf, sizeof(buf))) >= 0) {
struct ieee80211req_sta_info *si;
bufpos = buf;
while (len > sizeof(struct ieee80211req_sta_info)) {
si = (struct ieee80211req_sta_info*)bufpos;
getkey(IEEE80211_KEYIX_NONE, si->isi_macaddr, 0);
bufpos += si->isi_len;
len -= si->isi_len;
}
}
}
void set_wpa(int cipher, int wpa, int key) {
printf("Setting WPA: cipher=%s wpa=%i mgmt=%i\n",
strcipher(cipher), wpa, key);
set80211param(IEEE80211_PARAM_MCASTCIPHER, cipher);
set80211param(IEEE80211_PARAM_UCASTCIPHERS, 1 << cipher);
set80211param(IEEE80211_PARAM_KEYMGTALGS, key);
set80211param(IEEE80211_PARAM_WPA, wpa);
set80211param(IEEE80211_PARAM_PRIVACY, wpa > 0? 1 : 0);
}
void init() {
sock = socket(PF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
perror("socket()");
exit(32);
}
}
void help() {
fprintf(stderr, "Possible options are:\n"
" -a print all group keys\n"
" -A print all keys (default option)\n"
" -i <if> set interface (default: %s)\n"
" -w WPA on\n"
" -n no WPA\n"
" -k <idx|mac> set / read specified key (default: 0)\n"
" -c <#> set ciphers\n"
" -f <#|rtgd> set key flags - integer or: Rx/Tx/Group/Default\n"
" [-|<key>] ASCII text to be set as key or '-' to unset.\n"
"\n"
"Example:\n"
" # activate WPA on ath3, write an RX+TX key to slot #3\n"
" ./wpakey -i ath3 -w -k 3 -f rt XXXXXXXXXXXXXXXX\n"
"", dev);
}
int main(int argc, char** argv) {
int keyidx = 0;
uint8_t mac[6];
int cipher = IEEE80211_CIPHER_AES_CCM;
int flags = IEEE80211_KEY_RECV | IEEE80211_KEY_XMIT;
int c;
int i;
init();
if (argc == 1) {
for (i = 0; i <= 3; i++) {
getkey(i, NULL, 1);
}
iter_sta();
return 0;
}
while ((c = getopt(argc, argv, "aAhi:f:c:k:wn")) != -1) {
//printf("%c - %s\n", c, optarg);
switch (c) {
case 'a':
case 'A':
for (i = 0; i <= 3; i++) {
getkey(i, NULL, 1);
}
if (c == 'A')
iter_sta();
break;
case 'h':
help();
break;
case 'i':
dev = optarg;
break;
case 'f':
if (isalpha(optarg[0])) {
flags = 0;
while (*optarg) switch (*optarg++) {
case 'g': flags |= IEEE80211_KEY_GROUP; break;
case 'r': flags |= IEEE80211_KEY_RECV; break;
case 't': flags |= IEEE80211_KEY_XMIT; break;
case 'd': flags |= IEEE80211_KEY_DEFAULT; break;
}
} else
flags = strtol(optarg, NULL, 0);
printf("flags = 0x%02x\n", flags);
break;
case 'c':
cipher = strtol(optarg, NULL, 0);
printf("cipher = %x\n", cipher);
break;
case 'w':
set_wpa(cipher, 3, WPA_ASE_8021X_PSK);
break;
case 'n':
set_wpa(IEEE80211_CIPHER_NONE, 0, WPA_ASE_NONE);
break;
case 'k':
if (strlen(optarg) < 17)
keyidx = atoi(optarg);
else {
keyidx = IEEE80211_KEYIX_NONE;
parse_mac(mac, optarg);
}
getkey(keyidx, mac, 1);
break;
}
}
if (optind < argc) {
switch (argv[optind][0]) {
case '-':
delkey(keyidx, mac);
setkey(keyidx, mac, IEEE80211_CIPHER_NONE, 0, 0, NULL);
getkey(keyidx, mac, 1);
return 0;
case 'g':
flags |= IEEE80211_KEY_GROUP;
break;
case 'd':
flags |= IEEE80211_KEY_DEFAULT;
break;
}
setkey(keyidx, mac, cipher,
flags, 128/8, argv[optind]);
getkey(keyidx, mac, 1);
}
return 0;
}