1 /* 2 * common module tests 3 * Copyright (c) 2014-2015, Jouni Malinen <j@w1.fi> 4 * 5 * This software may be distributed under the terms of the BSD license. 6 * See README for more details. 7 */ 8 9 #include "utils/includes.h" 10 11 #include "utils/common.h" 12 #include "utils/module_tests.h" 13 #include "ieee802_11_common.h" 14 #include "ieee802_11_defs.h" 15 #include "gas.h" 16 #include "wpa_common.h" 17 18 19 struct ieee802_11_parse_test_data { 20 u8 *data; 21 size_t len; 22 ParseRes result; 23 int count; 24 }; 25 26 static const struct ieee802_11_parse_test_data parse_tests[] = { 27 { (u8 *) "", 0, ParseOK, 0 }, 28 { (u8 *) " ", 1, ParseFailed, 0 }, 29 { (u8 *) "\xff\x00", 2, ParseUnknown, 1 }, 30 { (u8 *) "\xff\x01", 2, ParseFailed, 0 }, 31 { (u8 *) "\xdd\x03\x01\x02\x03", 5, ParseUnknown, 1 }, 32 { (u8 *) "\xdd\x04\x01\x02\x03\x04", 6, ParseUnknown, 1 }, 33 { (u8 *) "\xdd\x04\x00\x50\xf2\x02", 6, ParseUnknown, 1 }, 34 { (u8 *) "\xdd\x05\x00\x50\xf2\x02\x02", 7, ParseOK, 1 }, 35 { (u8 *) "\xdd\x05\x00\x50\xf2\x02\xff", 7, ParseUnknown, 1 }, 36 { (u8 *) "\xdd\x04\x00\x50\xf2\xff", 6, ParseUnknown, 1 }, 37 { (u8 *) "\xdd\x04\x50\x6f\x9a\xff", 6, ParseUnknown, 1 }, 38 { (u8 *) "\xdd\x04\x00\x90\x4c\x33", 6, ParseOK, 1 }, 39 { (u8 *) "\xdd\x04\x00\x90\x4c\xff\xdd\x04\x00\x90\x4c\x33", 12, 40 ParseUnknown, 2 }, 41 { (u8 *) "\x10\x01\x00\x21\x00", 5, ParseOK, 2 }, 42 { (u8 *) "\x24\x00", 2, ParseOK, 1 }, 43 { (u8 *) "\x38\x00", 2, ParseOK, 1 }, 44 { (u8 *) "\x54\x00", 2, ParseOK, 1 }, 45 { (u8 *) "\x5a\x00", 2, ParseOK, 1 }, 46 { (u8 *) "\x65\x00", 2, ParseOK, 1 }, 47 { (u8 *) "\x65\x12\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11", 48 20, ParseOK, 1 }, 49 { (u8 *) "\x6e\x00", 2, ParseOK, 1 }, 50 { (u8 *) "\xc7\x00", 2, ParseOK, 1 }, 51 { (u8 *) "\xc7\x01\x00", 3, ParseOK, 1 }, 52 { (u8 *) "\x03\x00\x2a\x00\x36\x00\x37\x00\x38\x00\x2d\x00\x3d\x00\xbf\x00\xc0\x00", 53 18, ParseOK, 9 }, 54 { (u8 *) "\x8b\x00", 2, ParseOK, 1 }, 55 { (u8 *) "\xdd\x04\x00\x90\x4c\x04", 6, ParseUnknown, 1 }, 56 { NULL, 0, ParseOK, 0 } 57 }; 58 59 static int ieee802_11_parse_tests(void) 60 { 61 int i, ret = 0; 62 63 wpa_printf(MSG_INFO, "ieee802_11_parse tests"); 64 65 for (i = 0; parse_tests[i].data; i++) { 66 const struct ieee802_11_parse_test_data *test; 67 struct ieee802_11_elems elems; 68 ParseRes res; 69 70 test = &parse_tests[i]; 71 res = ieee802_11_parse_elems(test->data, test->len, &elems, 1); 72 if (res != test->result || 73 ieee802_11_ie_count(test->data, test->len) != test->count) { 74 wpa_printf(MSG_ERROR, "ieee802_11_parse test %d failed", 75 i); 76 ret = -1; 77 } 78 } 79 80 if (ieee802_11_vendor_ie_concat((const u8 *) "\x00\x01", 2, 0) != NULL) 81 { 82 wpa_printf(MSG_ERROR, 83 "ieee802_11_vendor_ie_concat test failed"); 84 ret = -1; 85 } 86 87 return ret; 88 } 89 90 91 struct rsn_ie_parse_test_data { 92 u8 *data; 93 size_t len; 94 int result; 95 }; 96 97 static const struct rsn_ie_parse_test_data rsn_parse_tests[] = { 98 { (u8 *) "", 0, -1 }, 99 { (u8 *) "\x30\x00", 2, -1 }, 100 { (u8 *) "\x30\x02\x01\x00", 4, 0 }, 101 { (u8 *) "\x30\x02\x00\x00", 4, -2 }, 102 { (u8 *) "\x30\x02\x02\x00", 4, -2 }, 103 { (u8 *) "\x30\x02\x00\x01", 4, -2 }, 104 { (u8 *) "\x30\x02\x00\x00\x00", 5, -2 }, 105 { (u8 *) "\x30\x03\x01\x00\x00", 5, -3 }, 106 { (u8 *) "\x30\x06\x01\x00\x00\x00\x00\x00", 8, -1 }, 107 { (u8 *) "\x30\x06\x01\x00\x00\x0f\xac\x04", 8, 0 }, 108 { (u8 *) "\x30\x07\x01\x00\x00\x0f\xac\x04\x00", 9, -5 }, 109 { (u8 *) "\x30\x08\x01\x00\x00\x0f\xac\x04\x00\x00", 10, -4 }, 110 { (u8 *) "\x30\x08\x01\x00\x00\x0f\xac\x04\x00\x01", 10, -4 }, 111 { (u8 *) "\x30\x0c\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04", 112 14, 0 }, 113 { (u8 *) "\x30\x0c\x01\x00\x00\x0f\xac\x04\x00\x01\x00\x0f\xac\x04", 114 14, -4 }, 115 { (u8 *) "\x30\x0c\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x06", 116 14, -1 }, 117 { (u8 *) "\x30\x10\x01\x00\x00\x0f\xac\x04\x02\x00\x00\x0f\xac\x04\x00\x0f\xac\x08", 118 18, 0 }, 119 { (u8 *) "\x30\x0d\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x00", 120 15, -7 }, 121 { (u8 *) "\x30\x0e\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x00\x00", 122 16, -6 }, 123 { (u8 *) "\x30\x0e\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x00\x01", 124 16, -6 }, 125 { (u8 *) "\x30\x12\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x01", 126 20, 0 }, 127 { (u8 *) "\x30\x16\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x02\x00\x00\x0f\xac\x01\x00\x0f\xac\x02", 128 24, 0 }, 129 { (u8 *) "\x30\x13\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x01\x00", 130 21, 0 }, 131 { (u8 *) "\x30\x14\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x01\x00\x00", 132 22, 0 }, 133 { (u8 *) "\x30\x16\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x01\x00\x00\x00\x00", 134 24, 0 }, 135 { (u8 *) "\x30\x16\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x01\x00\x00\x00\x01", 136 24, -9 }, 137 { (u8 *) "\x30\x1a\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x01\x00\x00\x00\x00\x00\x00\x00\x00", 138 28, -10 }, 139 { (u8 *) "\x30\x1a\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x01\x00\x00\x00\x00\x00\x0f\xac\x06", 140 28, 0 }, 141 { (u8 *) "\x30\x1c\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x01\x00\x00\x00\x00\x00\x0f\xac\x06\x01\x02", 142 30, 0 }, 143 { NULL, 0, 0 } 144 }; 145 146 static int rsn_ie_parse_tests(void) 147 { 148 int i, ret = 0; 149 150 wpa_printf(MSG_INFO, "rsn_ie_parse tests"); 151 152 for (i = 0; rsn_parse_tests[i].data; i++) { 153 const struct rsn_ie_parse_test_data *test; 154 struct wpa_ie_data data; 155 156 test = &rsn_parse_tests[i]; 157 if (wpa_parse_wpa_ie_rsn(test->data, test->len, &data) != 158 test->result) { 159 wpa_printf(MSG_ERROR, "rsn_ie_parse test %d failed", i); 160 ret = -1; 161 } 162 } 163 164 return ret; 165 } 166 167 168 static int gas_tests(void) 169 { 170 struct wpabuf *buf; 171 172 wpa_printf(MSG_INFO, "gas tests"); 173 gas_anqp_set_len(NULL); 174 175 buf = wpabuf_alloc(1); 176 if (buf == NULL) 177 return -1; 178 gas_anqp_set_len(buf); 179 wpabuf_free(buf); 180 181 buf = wpabuf_alloc(20); 182 if (buf == NULL) 183 return -1; 184 wpabuf_put_u8(buf, WLAN_ACTION_PUBLIC); 185 wpabuf_put_u8(buf, WLAN_PA_GAS_INITIAL_REQ); 186 wpabuf_put_u8(buf, 0); 187 wpabuf_put_be32(buf, 0); 188 wpabuf_put_u8(buf, 0); 189 gas_anqp_set_len(buf); 190 wpabuf_free(buf); 191 192 return 0; 193 } 194 195 196 int common_module_tests(void) 197 { 198 int ret = 0; 199 200 wpa_printf(MSG_INFO, "common module tests"); 201 202 if (ieee802_11_parse_tests() < 0 || 203 gas_tests() < 0 || 204 rsn_ie_parse_tests() < 0) 205 ret = -1; 206 207 return ret; 208 } 209