From: Marcel Holtmann <marcel@holtmann.org>
To: Johannes Berg <johannes@sipsolutions.net>
Cc: linux-wireless@vger.kernel.org, Marcel Holtmann <marcel@holtmann.org>
Subject: [PATCH] add support for parsing WPA and RSN/WPA2 information elements
Date: Sun, 3 May 2009 21:46:21 -0700 [thread overview]
Message-ID: <1241412381-2778-1-git-send-email-marcel@holtmann.org> (raw)
---
scan.c | 156 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 150 insertions(+), 6 deletions(-)
diff --git a/scan.c b/scan.c
index 91e94ed..d383243 100644
--- a/scan.c
+++ b/scan.c
@@ -13,6 +13,9 @@
#include "nl80211.h"
#include "iw.h"
+static unsigned char vendor_oui[3] = { 0x00, 0x50, 0xf2 };
+static unsigned char cipher_oui[3] = { 0x00, 0x0f, 0xac };
+
struct scan_params {
bool unknown;
};
@@ -41,6 +44,14 @@ COMMAND(scan, trigger, NULL,
typedef void (*printfn)(unsigned char type, unsigned char len, unsigned char *data);
+static void tab_on_first(bool *first)
+{
+ if (!*first)
+ printf("\t");
+ else
+ *first = false;
+}
+
static void print_ssid(unsigned char type, unsigned char len, unsigned char *data)
{
int i;
@@ -80,20 +91,152 @@ static void print_ign(unsigned char type, unsigned char len, unsigned char *data
/* ignore for now, not too useful */
}
+static void print_cipher(const unsigned char *oui, unsigned char *data)
+{
+ if (memcmp(data, oui, 3) == 0) {
+ switch (data[3]) {
+ case 0x00:
+ printf("Use group cipher suite");
+ break;
+ case 0x01:
+ printf("WEP-40");
+ break;
+ case 0x02:
+ printf("TKIP");
+ break;
+ case 0x04:
+ printf("CCMP");
+ break;
+ case 0x05:
+ printf("WEP-104");
+ break;
+ default:
+ printf("Reserved (%.02x)", data[3]);
+ break;
+ }
+ } else if (memcmp(data, vendor_oui, 3) == 0)
+ printf("Vendor specific (%.02x)", data[3]);
+ else
+ printf("Other");
+}
+
+static void print_auth(const unsigned char *oui, unsigned char *data)
+{
+ if (memcmp(data, oui, 3) == 0) {
+ switch (data[3]) {
+ case 0x01:
+ printf("802.1x");
+ break;
+ case 0x02:
+ printf("PSK");
+ break;
+ default:
+ printf("Reserved (%.02x)", data[3]);
+ break;
+ }
+ } else if (memcmp(data, vendor_oui, 3) == 0)
+ printf("Vendor specific (%.02x)", data[3]);
+ else
+ printf("Other");
+}
+
+static void print_wpa(const char *ie, const unsigned char *oui,
+ unsigned char len, unsigned char *data)
+{
+ bool first = true;
+ __u16 version, count, capa;
+ int i;
+
+ printf("\t%s:", ie);
+
+ if (len < 2) {
+ printf(" <too short> data:");
+ for(i = 0; i < len; i++)
+ printf(" %.02x", data[i]);
+ printf("\n");
+ return;
+ }
+
+ version = data[0] + (data[1] << 8);
+ tab_on_first(&first);
+ printf("\t * Version: %d\n", version);
+
+ data += 2;
+ len -= 2;
+
+ if (len < 4) {
+ tab_on_first(&first);
+ printf("\t * Group cipher: TKIP\n");
+ printf("\t * Pairwise ciphers: TKIP\n");
+ return;
+ }
+
+ tab_on_first(&first);
+ printf("\t * Group cipher: ");
+ print_cipher(oui, data);
+ printf("\n");
+
+ data += 4;
+ len -= 4;
+
+ if (len < 2) {
+ tab_on_first(&first);
+ printf("\t * Pairwise ciphers: TKIP\n");
+ return;
+ }
+
+ count = data[0] | (data[1] << 8);
+ tab_on_first(&first);
+ printf("\t * Pairwise ciphers:");
+ for (i=0; i<count; i++) {
+ printf(" ");
+ print_cipher(oui, data + 2 + (i * 4));
+ }
+ printf("\n");
+
+ data += 2 + (count * 4);
+ len -= 2 + (count * 4);
+
+ if (len < 2)
+ return;
+
+ count = data[0] | (data[1] << 8);
+ tab_on_first(&first);
+ printf("\t * Authentication suites:");
+ for (i=0; i<count; i++) {
+ printf(" ");
+ print_auth(oui, data + 2 + (i * 4));
+ }
+ printf("\n");
+
+ data += 2 + (count * 4);
+ len -= 2 + (count * 4);
+
+ if (len < 2)
+ return;
+
+ capa = data[0] | (data[1] << 8);
+ tab_on_first(&first);
+ printf("\t * Capabilities: 0x%.4x\n", capa);
+}
+
+static void print_rsn(unsigned char type, unsigned char len, unsigned char *data)
+{
+ print_wpa("WPA2", cipher_oui, len, data);
+}
+
static const printfn ieprinters[] = {
[0] = print_ssid,
[1] = print_supprates,
[3] = print_ds,
[5] = print_ign,
+ [48] = print_rsn,
[50] = print_supprates,
};
-static void tab_on_first(bool *first)
+static void print_wifi_wpa(unsigned char type, unsigned char len, unsigned char *data)
{
- if (!*first)
- printf("\t");
- else
- *first = false;
+ print_wpa("WPA", vendor_oui, len, data);
}
static void print_wifi_wps(unsigned char type, unsigned char len, unsigned char *data)
@@ -177,6 +320,7 @@ static void print_wifi_wps(unsigned char type, unsigned char len, unsigned char
}
static const printfn wifiprinters[] = {
+ [1] = print_wifi_wpa,
[4] = print_wifi_wps,
};
@@ -193,7 +337,7 @@ static void print_vendor(unsigned char len, unsigned char *data,
return;
}
- if (len >= 4 && data[0] == 0x00 && data[1] == 0x50 && data[2] == 0xF2) {
+ if (len >= 4 && memcmp(data, vendor_oui, 3) == 0) {
if (data[3] < ARRAY_SIZE(wifiprinters) && wifiprinters[data[3]])
return wifiprinters[data[3]](data[3], len - 4, data + 4);
if (!params->unknown)
--
1.6.0.6
next reply other threads:[~2009-05-04 4:46 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-04 4:46 Marcel Holtmann [this message]
2009-05-04 7:34 ` [PATCH] add support for parsing WPA and RSN/WPA2 information elements Johannes Berg
2009-05-04 7:40 ` Marcel Holtmann
2009-05-04 7:47 ` Johannes Berg
2009-05-04 7:51 ` Marcel Holtmann
2009-05-04 7:55 ` Johannes Berg
2009-05-04 8:06 ` Jouni Malinen
2009-05-04 8:53 ` Marcel Holtmann
2009-05-05 8:35 ` Jouni Malinen
2009-05-05 15:56 ` Marcel Holtmann
2009-05-05 16:03 ` Johannes Berg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1241412381-2778-1-git-send-email-marcel@holtmann.org \
--to=marcel@holtmann.org \
--cc=johannes@sipsolutions.net \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.