diff --git a/Makefile.am b/Makefile.am index b1e983ad..03997795 100644 --- a/Makefile.am +++ b/Makefile.am @@ -203,7 +203,8 @@ unit_test_crypto_SOURCES = unit/test-crypto.c \ unit_test_crypto_LDADD = ell/libell-internal.la unit_test_mpdu_SOURCES = unit/test-mpdu.c \ - src/mpdu.h src/mpdu.c + src/mpdu.h src/mpdu.c \ + src/ie.h src/ie.c unit_test_mpdu_LDADD = ell/libell-internal.la unit_test_eapol_SOURCES = unit/test-eapol.c \ diff --git a/unit/test-mpdu.c b/unit/test-mpdu.c index e6b64fa9..531b287c 100644 --- a/unit/test-mpdu.c +++ b/unit/test-mpdu.c @@ -30,6 +30,7 @@ #include #include "src/mpdu.h" +#include "src/ie.h" struct deauthentication_data { const unsigned char *frame; @@ -81,6 +82,80 @@ static void deauthentication_test(const void *data) assert(MPDU_SEQUENCE_NUMBER(*mpdu) == test->sequence_number); } +struct test_frame_data { + const uint8_t *data; + size_t len; + bool good; +}; + +static const uint8_t probe_req_good1[] = { + /* Header */ + 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, + 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x64, + /* + * SSID, Supported Rates, Extended Supported Rates, DSSS Parameter Set, + * HT Capabilities, Vendor Specific, Vendor Specific + */ + 0x00, 0x05, 0x74, 0x65, 0x73, 0x74, 0x31, 0x01, 0x08, 0x02, 0x04, 0x0b, + 0x16, 0x0c, 0x12, 0x18, 0x24, 0x32, 0x04, 0x30, 0x48, 0x60, 0x6c, 0x03, + 0x01, 0x06, 0x2d, 0x1a, 0x7e, 0x10, 0x1b, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0x69, 0x00, 0x50, 0xf2, 0x04, + 0x10, 0x4a, 0x00, 0x01, 0x10, 0x10, 0x3a, 0x00, 0x01, 0x00, 0x10, 0x08, + 0x00, 0x02, 0x31, 0x48, 0x10, 0x47, 0x00, 0x10, 0xd9, 0xec, 0x65, 0xb2, + 0x32, 0xe4, 0x53, 0x8d, 0xb2, 0x6c, 0x3f, 0x2b, 0x86, 0xf7, 0xa8, 0xd5, + 0x10, 0x54, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x3c, 0x00, 0x01, 0x03, 0x10, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10, + 0x09, 0x00, 0x02, 0x00, 0x00, 0x10, 0x12, 0x00, 0x02, 0x00, 0x00, 0x10, + 0x21, 0x00, 0x01, 0x20, 0x10, 0x23, 0x00, 0x01, 0x20, 0x10, 0x24, 0x00, + 0x01, 0x20, 0x10, 0x11, 0x00, 0x01, 0x20, 0x10, 0x49, 0x00, 0x06, 0x00, + 0x37, 0x2a, 0x00, 0x01, 0x20, 0xdd, 0x11, 0x50, 0x6f, 0x9a, 0x09, 0x02, + 0x02, 0x00, 0x25, 0x00, 0x06, 0x05, 0x00, 0x58, 0x58, 0x04, 0x51, 0x01, +}; +static const struct test_frame_data probe_req_good1_data = + { probe_req_good1, sizeof(probe_req_good1), true }; + +static const uint8_t probe_req_good2[] = { + /* Header */ + 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, + 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x64, + /* SSID, Supported Rates, Extended Supported Rates */ + 0x00, 0x05, 0x74, 0x65, 0x73, 0x74, 0x31, 0x01, 0x08, 0x02, 0x04, 0x0b, + 0x16, 0x0c, 0x12, 0x18, 0x24, 0x32, 0x04, 0x30, 0x48, 0x60, 0x6c, +}; +static const struct test_frame_data probe_req_good2_data = + { probe_req_good2, sizeof(probe_req_good2), true }; + +static const uint8_t probe_req_bad1[] = { + /* Header */ + 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, + 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x64, + /* SSID, Extended Supported Rates, Supported Rates */ + 0x00, 0x05, 0x74, 0x65, 0x73, 0x74, 0x31, 0x32, 0x04, 0x30, 0x48, 0x60, + 0x6c, 0x01, 0x08, 0x02, 0x04, 0x0b, 0x16, 0x0c, 0x12, 0x18, 0x24, +}; +static const struct test_frame_data probe_req_bad1_data = + { probe_req_bad1, sizeof(probe_req_bad1), false }; + +static const uint8_t probe_req_bad2[] = { + /* Header */ + 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, + 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x64, + /* SSID, SSID, Supported Rates, Extended Supported Rates */ + 0x00, 0x05, 0x74, 0x65, 0x73, 0x74, 0x31, 0x00, 0x05, 0x74, 0x65, 0x73, + 0x74, 0x31, 0x01, 0x08, 0x02, 0x04, 0x0b, 0x16, 0x0c, 0x12, 0x18, 0x24, + 0x32, 0x04, 0x30, 0x48, 0x60, 0x6c, +}; +static const struct test_frame_data probe_req_bad2_data = + { probe_req_bad2, sizeof(probe_req_bad2), false }; + +static void ie_order_test(const void *data) +{ + const struct test_frame_data *frame = data; + + assert(!!mpdu_validate(frame->data, frame->len) == frame->good); +} + int main(int argc, char *argv[]) { l_test_init(&argc, &argv); @@ -88,5 +163,10 @@ int main(int argc, char *argv[]) l_test_add("/Management Frame/Deauthentication Frame 1", deauthentication_test, &deauthentication_test_1); + l_test_add("/IE order/Good 1", ie_order_test, &probe_req_good1_data); + l_test_add("/IE order/Good 2", ie_order_test, &probe_req_good2_data); + l_test_add("/IE order/Bad 1", ie_order_test, &probe_req_bad1_data); + l_test_add("/IE order/Bad 2", ie_order_test, &probe_req_bad2_data); + return l_test_run(); }