2 * Wi-Fi Protected Setup - attribute parsing
3 * Copyright (c) 2008, Jouni Malinen <j@w1.fi>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
9 * Alternatively, this software may be distributed under the terms of BSD
12 * See README and COPYING for more details.
21 static int wps_set_attr(struct wps_parse_attr *attr, u16 type,
22 const u8 *pos, u16 len)
27 wpa_printf(MSG_DEBUG, "WPS: Invalid Version length %u",
35 wpa_printf(MSG_DEBUG, "WPS: Invalid Message Type "
41 case ATTR_ENROLLEE_NONCE:
42 if (len != WPS_NONCE_LEN) {
43 wpa_printf(MSG_DEBUG, "WPS: Invalid Enrollee Nonce "
47 attr->enrollee_nonce = pos;
49 case ATTR_REGISTRAR_NONCE:
50 if (len != WPS_NONCE_LEN) {
51 wpa_printf(MSG_DEBUG, "WPS: Invalid Registrar Nonce "
55 attr->registrar_nonce = pos;
58 if (len != WPS_UUID_LEN) {
59 wpa_printf(MSG_DEBUG, "WPS: Invalid UUID-E length %u",
66 if (len != WPS_UUID_LEN) {
67 wpa_printf(MSG_DEBUG, "WPS: Invalid UUID-R length %u",
73 case ATTR_AUTH_TYPE_FLAGS:
75 wpa_printf(MSG_DEBUG, "WPS: Invalid Authentication "
76 "Type Flags length %u", len);
79 attr->auth_type_flags = pos;
81 case ATTR_ENCR_TYPE_FLAGS:
83 wpa_printf(MSG_DEBUG, "WPS: Invalid Encryption Type "
84 "Flags length %u", len);
87 attr->encr_type_flags = pos;
89 case ATTR_CONN_TYPE_FLAGS:
91 wpa_printf(MSG_DEBUG, "WPS: Invalid Connection Type "
92 "Flags length %u", len);
95 attr->conn_type_flags = pos;
97 case ATTR_CONFIG_METHODS:
99 wpa_printf(MSG_DEBUG, "WPS: Invalid Config Methods "
103 attr->config_methods = pos;
105 case ATTR_SELECTED_REGISTRAR_CONFIG_METHODS:
107 wpa_printf(MSG_DEBUG, "WPS: Invalid Selected "
108 "Registrar Config Methods length %u", len);
111 attr->sel_reg_config_methods = pos;
113 case ATTR_PRIMARY_DEV_TYPE:
114 if (len != sizeof(struct wps_dev_type)) {
115 wpa_printf(MSG_DEBUG, "WPS: Invalid Primary Device "
116 "Type length %u", len);
119 attr->primary_dev_type = pos;
123 wpa_printf(MSG_DEBUG, "WPS: Invalid RF Bands length "
127 attr->rf_bands = pos;
129 case ATTR_ASSOC_STATE:
131 wpa_printf(MSG_DEBUG, "WPS: Invalid Association State "
135 attr->assoc_state = pos;
137 case ATTR_CONFIG_ERROR:
139 wpa_printf(MSG_DEBUG, "WPS: Invalid Configuration "
140 "Error length %u", len);
143 attr->config_error = pos;
145 case ATTR_DEV_PASSWORD_ID:
147 wpa_printf(MSG_DEBUG, "WPS: Invalid Device Password "
148 "ID length %u", len);
151 attr->dev_password_id = pos;
153 case ATTR_OS_VERSION:
155 wpa_printf(MSG_DEBUG, "WPS: Invalid OS Version length "
159 attr->os_version = pos;
163 wpa_printf(MSG_DEBUG, "WPS: Invalid Wi-Fi Protected "
164 "Setup State length %u", len);
167 attr->wps_state = pos;
169 case ATTR_AUTHENTICATOR:
170 if (len != WPS_AUTHENTICATOR_LEN) {
171 wpa_printf(MSG_DEBUG, "WPS: Invalid Authenticator "
175 attr->authenticator = pos;
178 if (len != WPS_HASH_LEN) {
179 wpa_printf(MSG_DEBUG, "WPS: Invalid R-Hash1 length %u",
186 if (len != WPS_HASH_LEN) {
187 wpa_printf(MSG_DEBUG, "WPS: Invalid R-Hash2 length %u",
194 if (len != WPS_HASH_LEN) {
195 wpa_printf(MSG_DEBUG, "WPS: Invalid E-Hash1 length %u",
202 if (len != WPS_HASH_LEN) {
203 wpa_printf(MSG_DEBUG, "WPS: Invalid E-Hash2 length %u",
210 if (len != WPS_SECRET_NONCE_LEN) {
211 wpa_printf(MSG_DEBUG, "WPS: Invalid R-SNonce1 length "
215 attr->r_snonce1 = pos;
218 if (len != WPS_SECRET_NONCE_LEN) {
219 wpa_printf(MSG_DEBUG, "WPS: Invalid R-SNonce2 length "
223 attr->r_snonce2 = pos;
226 if (len != WPS_SECRET_NONCE_LEN) {
227 wpa_printf(MSG_DEBUG, "WPS: Invalid E-SNonce1 length "
231 attr->e_snonce1 = pos;
234 if (len != WPS_SECRET_NONCE_LEN) {
235 wpa_printf(MSG_DEBUG, "WPS: Invalid E-SNonce2 length "
239 attr->e_snonce2 = pos;
241 case ATTR_KEY_WRAP_AUTH:
242 if (len != WPS_KWA_LEN) {
243 wpa_printf(MSG_DEBUG, "WPS: Invalid Key Wrap "
244 "Authenticator length %u", len);
247 attr->key_wrap_auth = pos;
251 wpa_printf(MSG_DEBUG, "WPS: Invalid Authentication "
252 "Type length %u", len);
255 attr->auth_type = pos;
259 wpa_printf(MSG_DEBUG, "WPS: Invalid Encryption "
260 "Type length %u", len);
263 attr->encr_type = pos;
265 case ATTR_NETWORK_INDEX:
267 wpa_printf(MSG_DEBUG, "WPS: Invalid Network Index "
271 attr->network_idx = pos;
273 case ATTR_NETWORK_KEY_INDEX:
275 wpa_printf(MSG_DEBUG, "WPS: Invalid Network Key Index "
279 attr->network_key_idx = pos;
282 if (len != ETH_ALEN) {
283 wpa_printf(MSG_DEBUG, "WPS: Invalid MAC Address "
287 attr->mac_addr = pos;
289 case ATTR_KEY_PROVIDED_AUTO:
291 wpa_printf(MSG_DEBUG, "WPS: Invalid Key Provided "
292 "Automatically length %u", len);
295 attr->key_prov_auto = pos;
297 case ATTR_802_1X_ENABLED:
299 wpa_printf(MSG_DEBUG, "WPS: Invalid 802.1X Enabled "
303 attr->dot1x_enabled = pos;
305 case ATTR_SELECTED_REGISTRAR:
307 wpa_printf(MSG_DEBUG, "WPS: Invalid Selected Registrar"
311 attr->selected_registrar = pos;
313 case ATTR_REQUEST_TYPE:
315 wpa_printf(MSG_DEBUG, "WPS: Invalid Request Type "
319 attr->request_type = pos;
321 case ATTR_RESPONSE_TYPE:
323 wpa_printf(MSG_DEBUG, "WPS: Invalid Response Type "
327 attr->request_type = pos;
329 case ATTR_MANUFACTURER:
330 attr->manufacturer = pos;
331 attr->manufacturer_len = len;
333 case ATTR_MODEL_NAME:
334 attr->model_name = pos;
335 attr->model_name_len = len;
337 case ATTR_MODEL_NUMBER:
338 attr->model_number = pos;
339 attr->model_number_len = len;
341 case ATTR_SERIAL_NUMBER:
342 attr->serial_number = pos;
343 attr->serial_number_len = len;
346 attr->dev_name = pos;
347 attr->dev_name_len = len;
349 case ATTR_PUBLIC_KEY:
350 attr->public_key = pos;
351 attr->public_key_len = len;
353 case ATTR_ENCR_SETTINGS:
354 attr->encr_settings = pos;
355 attr->encr_settings_len = len;
358 if (attr->num_cred >= MAX_CRED_COUNT) {
359 wpa_printf(MSG_DEBUG, "WPS: Skipped Credential "
360 "attribute (max %d credentials)",
364 attr->cred[attr->num_cred] = pos;
365 attr->cred_len[attr->num_cred] = len;
370 attr->ssid_len = len;
372 case ATTR_NETWORK_KEY:
373 attr->network_key = pos;
374 attr->network_key_len = len;
377 attr->eap_type = pos;
378 attr->eap_type_len = len;
380 case ATTR_EAP_IDENTITY:
381 attr->eap_identity = pos;
382 attr->eap_identity_len = len;
384 case ATTR_AP_SETUP_LOCKED:
386 wpa_printf(MSG_DEBUG, "WPS: Invalid AP Setup Locked "
390 attr->ap_setup_locked = pos;
393 wpa_printf(MSG_DEBUG, "WPS: Unsupported attribute type 0x%x "
394 "len=%u", type, len);
402 int wps_parse_msg(const struct wpabuf *msg, struct wps_parse_attr *attr)
407 os_memset(attr, 0, sizeof(*attr));
408 pos = wpabuf_head(msg);
409 end = pos + wpabuf_len(msg);
413 wpa_printf(MSG_DEBUG, "WPS: Invalid message - "
414 "%lu bytes remaining",
415 (unsigned long) (end - pos));
419 type = WPA_GET_BE16(pos);
421 len = WPA_GET_BE16(pos);
423 wpa_printf(MSG_MSGDUMP, "WPS: attr type=0x%x len=%u",
425 if (len > end - pos) {
426 wpa_printf(MSG_DEBUG, "WPS: Attribute overflow");
430 if (wps_set_attr(attr, type, pos, len) < 0)