xref: /freebsd/contrib/wpa/src/wps/wps.h (revision 39beb93c3f8bdbf72a61fda42300b5ebed7390c8)
139beb93cSSam Leffler /*
239beb93cSSam Leffler  * Wi-Fi Protected Setup
339beb93cSSam Leffler  * Copyright (c) 2007-2008, Jouni Malinen <j@w1.fi>
439beb93cSSam Leffler  *
539beb93cSSam Leffler  * This program is free software; you can redistribute it and/or modify
639beb93cSSam Leffler  * it under the terms of the GNU General Public License version 2 as
739beb93cSSam Leffler  * published by the Free Software Foundation.
839beb93cSSam Leffler  *
939beb93cSSam Leffler  * Alternatively, this software may be distributed under the terms of BSD
1039beb93cSSam Leffler  * license.
1139beb93cSSam Leffler  *
1239beb93cSSam Leffler  * See README and COPYING for more details.
1339beb93cSSam Leffler  */
1439beb93cSSam Leffler 
1539beb93cSSam Leffler #ifndef WPS_H
1639beb93cSSam Leffler #define WPS_H
1739beb93cSSam Leffler 
1839beb93cSSam Leffler #include "wps_defs.h"
1939beb93cSSam Leffler 
2039beb93cSSam Leffler /**
2139beb93cSSam Leffler  * enum wsc_op_code - EAP-WSC OP-Code values
2239beb93cSSam Leffler  */
2339beb93cSSam Leffler enum wsc_op_code {
2439beb93cSSam Leffler 	WSC_UPnP = 0 /* No OP Code in UPnP transport */,
2539beb93cSSam Leffler 	WSC_Start = 0x01,
2639beb93cSSam Leffler 	WSC_ACK = 0x02,
2739beb93cSSam Leffler 	WSC_NACK = 0x03,
2839beb93cSSam Leffler 	WSC_MSG = 0x04,
2939beb93cSSam Leffler 	WSC_Done = 0x05,
3039beb93cSSam Leffler 	WSC_FRAG_ACK = 0x06
3139beb93cSSam Leffler };
3239beb93cSSam Leffler 
3339beb93cSSam Leffler struct wps_registrar;
3439beb93cSSam Leffler struct upnp_wps_device_sm;
3539beb93cSSam Leffler 
3639beb93cSSam Leffler /**
3739beb93cSSam Leffler  * struct wps_credential - WPS Credential
3839beb93cSSam Leffler  * @ssid: SSID
3939beb93cSSam Leffler  * @ssid_len: Length of SSID
4039beb93cSSam Leffler  * @auth_type: Authentication Type (WPS_AUTH_OPEN, .. flags)
4139beb93cSSam Leffler  * @encr_type: Encryption Type (WPS_ENCR_NONE, .. flags)
4239beb93cSSam Leffler  * @key_idx: Key index
4339beb93cSSam Leffler  * @key: Key
4439beb93cSSam Leffler  * @key_len: Key length in octets
4539beb93cSSam Leffler  * @mac_addr: MAC address of the peer
4639beb93cSSam Leffler  * @cred_attr: Unparsed Credential attribute data (used only in cred_cb());
4739beb93cSSam Leffler  *	this may be %NULL, if not used
4839beb93cSSam Leffler  * @cred_attr_len: Length of cred_attr in octets
4939beb93cSSam Leffler  */
5039beb93cSSam Leffler struct wps_credential {
5139beb93cSSam Leffler 	u8 ssid[32];
5239beb93cSSam Leffler 	size_t ssid_len;
5339beb93cSSam Leffler 	u16 auth_type;
5439beb93cSSam Leffler 	u16 encr_type;
5539beb93cSSam Leffler 	u8 key_idx;
5639beb93cSSam Leffler 	u8 key[64];
5739beb93cSSam Leffler 	size_t key_len;
5839beb93cSSam Leffler 	u8 mac_addr[ETH_ALEN];
5939beb93cSSam Leffler 	const u8 *cred_attr;
6039beb93cSSam Leffler 	size_t cred_attr_len;
6139beb93cSSam Leffler };
6239beb93cSSam Leffler 
6339beb93cSSam Leffler /**
6439beb93cSSam Leffler  * struct wps_device_data - WPS Device Data
6539beb93cSSam Leffler  * @mac_addr: Device MAC address
6639beb93cSSam Leffler  * @device_name: Device Name (0..32 octets encoded in UTF-8)
6739beb93cSSam Leffler  * @manufacturer: Manufacturer (0..64 octets encoded in UTF-8)
6839beb93cSSam Leffler  * @model_name: Model Name (0..32 octets encoded in UTF-8)
6939beb93cSSam Leffler  * @model_number: Model Number (0..32 octets encoded in UTF-8)
7039beb93cSSam Leffler  * @serial_number: Serial Number (0..32 octets encoded in UTF-8)
7139beb93cSSam Leffler  * @categ: Primary Device Category
7239beb93cSSam Leffler  * @oui: Primary Device OUI
7339beb93cSSam Leffler  * @sub_categ: Primary Device Sub-Category
7439beb93cSSam Leffler  * @os_version: OS Version
7539beb93cSSam Leffler  * @rf_bands: RF bands (WPS_RF_24GHZ, WPS_RF_50GHZ flags)
7639beb93cSSam Leffler  */
7739beb93cSSam Leffler struct wps_device_data {
7839beb93cSSam Leffler 	u8 mac_addr[ETH_ALEN];
7939beb93cSSam Leffler 	char *device_name;
8039beb93cSSam Leffler 	char *manufacturer;
8139beb93cSSam Leffler 	char *model_name;
8239beb93cSSam Leffler 	char *model_number;
8339beb93cSSam Leffler 	char *serial_number;
8439beb93cSSam Leffler 	u16 categ;
8539beb93cSSam Leffler 	u32 oui;
8639beb93cSSam Leffler 	u16 sub_categ;
8739beb93cSSam Leffler 	u32 os_version;
8839beb93cSSam Leffler 	u8 rf_bands;
8939beb93cSSam Leffler };
9039beb93cSSam Leffler 
9139beb93cSSam Leffler /**
9239beb93cSSam Leffler  * struct wps_config - WPS configuration for a single registration protocol run
9339beb93cSSam Leffler  */
9439beb93cSSam Leffler struct wps_config {
9539beb93cSSam Leffler 	/**
9639beb93cSSam Leffler 	 * wps - Pointer to long term WPS context
9739beb93cSSam Leffler 	 */
9839beb93cSSam Leffler 	struct wps_context *wps;
9939beb93cSSam Leffler 
10039beb93cSSam Leffler 	/**
10139beb93cSSam Leffler 	 * registrar - Whether this end is a Registrar
10239beb93cSSam Leffler 	 */
10339beb93cSSam Leffler 	int registrar;
10439beb93cSSam Leffler 
10539beb93cSSam Leffler 	/**
10639beb93cSSam Leffler 	 * pin - Enrollee Device Password (%NULL for Registrar or PBC)
10739beb93cSSam Leffler 	 */
10839beb93cSSam Leffler 	const u8 *pin;
10939beb93cSSam Leffler 
11039beb93cSSam Leffler 	/**
11139beb93cSSam Leffler 	 * pin_len - Length on pin in octets
11239beb93cSSam Leffler 	 */
11339beb93cSSam Leffler 	size_t pin_len;
11439beb93cSSam Leffler 
11539beb93cSSam Leffler 	/**
11639beb93cSSam Leffler 	 * pbc - Whether this is protocol run uses PBC
11739beb93cSSam Leffler 	 */
11839beb93cSSam Leffler 	int pbc;
11939beb93cSSam Leffler 
12039beb93cSSam Leffler 	/**
12139beb93cSSam Leffler 	 * assoc_wps_ie: (Re)AssocReq WPS IE (in AP; %NULL if not AP)
12239beb93cSSam Leffler 	 */
12339beb93cSSam Leffler 	const struct wpabuf *assoc_wps_ie;
12439beb93cSSam Leffler };
12539beb93cSSam Leffler 
12639beb93cSSam Leffler struct wps_data * wps_init(const struct wps_config *cfg);
12739beb93cSSam Leffler 
12839beb93cSSam Leffler void wps_deinit(struct wps_data *data);
12939beb93cSSam Leffler 
13039beb93cSSam Leffler /**
13139beb93cSSam Leffler  * enum wps_process_res - WPS message processing result
13239beb93cSSam Leffler  */
13339beb93cSSam Leffler enum wps_process_res {
13439beb93cSSam Leffler 	/**
13539beb93cSSam Leffler 	 * WPS_DONE - Processing done
13639beb93cSSam Leffler 	 */
13739beb93cSSam Leffler 	WPS_DONE,
13839beb93cSSam Leffler 
13939beb93cSSam Leffler 	/**
14039beb93cSSam Leffler 	 * WPS_CONTINUE - Processing continues
14139beb93cSSam Leffler 	 */
14239beb93cSSam Leffler 	WPS_CONTINUE,
14339beb93cSSam Leffler 
14439beb93cSSam Leffler 	/**
14539beb93cSSam Leffler 	 * WPS_FAILURE - Processing failed
14639beb93cSSam Leffler 	 */
14739beb93cSSam Leffler 	WPS_FAILURE,
14839beb93cSSam Leffler 
14939beb93cSSam Leffler 	/**
15039beb93cSSam Leffler 	 * WPS_PENDING - Processing continues, but waiting for an external
15139beb93cSSam Leffler 	 *	event (e.g., UPnP message from an external Registrar)
15239beb93cSSam Leffler 	 */
15339beb93cSSam Leffler 	WPS_PENDING
15439beb93cSSam Leffler };
15539beb93cSSam Leffler enum wps_process_res wps_process_msg(struct wps_data *wps,
15639beb93cSSam Leffler 				     enum wsc_op_code op_code,
15739beb93cSSam Leffler 				     const struct wpabuf *msg);
15839beb93cSSam Leffler 
15939beb93cSSam Leffler struct wpabuf * wps_get_msg(struct wps_data *wps, enum wsc_op_code *op_code);
16039beb93cSSam Leffler 
16139beb93cSSam Leffler int wps_is_selected_pbc_registrar(const struct wpabuf *msg);
16239beb93cSSam Leffler int wps_is_selected_pin_registrar(const struct wpabuf *msg);
16339beb93cSSam Leffler const u8 * wps_get_uuid_e(const struct wpabuf *msg);
16439beb93cSSam Leffler 
16539beb93cSSam Leffler struct wpabuf * wps_build_assoc_req_ie(enum wps_request_type req_type);
16639beb93cSSam Leffler struct wpabuf * wps_build_probe_req_ie(int pbc, struct wps_device_data *dev,
16739beb93cSSam Leffler 				       const u8 *uuid,
16839beb93cSSam Leffler 				       enum wps_request_type req_type);
16939beb93cSSam Leffler 
17039beb93cSSam Leffler 
17139beb93cSSam Leffler /**
17239beb93cSSam Leffler  * struct wps_registrar_config - WPS Registrar configuration
17339beb93cSSam Leffler  */
17439beb93cSSam Leffler struct wps_registrar_config {
17539beb93cSSam Leffler 	/**
17639beb93cSSam Leffler 	 * new_psk_cb - Callback for new PSK
17739beb93cSSam Leffler 	 * @ctx: Higher layer context data (cb_ctx)
17839beb93cSSam Leffler 	 * @mac_addr: MAC address of the Enrollee
17939beb93cSSam Leffler 	 * @psk: The new PSK
18039beb93cSSam Leffler 	 * @psk_len: The length of psk in octets
18139beb93cSSam Leffler 	 * Returns: 0 on success, -1 on failure
18239beb93cSSam Leffler 	 *
18339beb93cSSam Leffler 	 * This callback is called when a new per-device PSK is provisioned.
18439beb93cSSam Leffler 	 */
18539beb93cSSam Leffler 	int (*new_psk_cb)(void *ctx, const u8 *mac_addr, const u8 *psk,
18639beb93cSSam Leffler 			  size_t psk_len);
18739beb93cSSam Leffler 
18839beb93cSSam Leffler 	/**
18939beb93cSSam Leffler 	 * set_ie_cb - Callback for WPS IE changes
19039beb93cSSam Leffler 	 * @ctx: Higher layer context data (cb_ctx)
19139beb93cSSam Leffler 	 * @beacon_ie: WPS IE for Beacon
19239beb93cSSam Leffler 	 * @beacon_ie_len: WPS IE length for Beacon
19339beb93cSSam Leffler 	 * @probe_resp_ie: WPS IE for Probe Response
19439beb93cSSam Leffler 	 * @probe_resp_ie_len: WPS IE length for Probe Response
19539beb93cSSam Leffler 	 * Returns: 0 on success, -1 on failure
19639beb93cSSam Leffler 	 *
19739beb93cSSam Leffler 	 * This callback is called whenever the WPS IE in Beacon or Probe
19839beb93cSSam Leffler 	 * Response frames needs to be changed (AP only).
19939beb93cSSam Leffler 	 */
20039beb93cSSam Leffler 	int (*set_ie_cb)(void *ctx, const u8 *beacon_ie, size_t beacon_ie_len,
20139beb93cSSam Leffler 			 const u8 *probe_resp_ie, size_t probe_resp_ie_len);
20239beb93cSSam Leffler 
20339beb93cSSam Leffler 	/**
20439beb93cSSam Leffler 	 * pin_needed_cb - Callback for requesting a PIN
20539beb93cSSam Leffler 	 * @ctx: Higher layer context data (cb_ctx)
20639beb93cSSam Leffler 	 * @uuid_e: UUID-E of the unknown Enrollee
20739beb93cSSam Leffler 	 * @dev: Device Data from the unknown Enrollee
20839beb93cSSam Leffler 	 *
20939beb93cSSam Leffler 	 * This callback is called whenever an unknown Enrollee requests to use
21039beb93cSSam Leffler 	 * PIN method and a matching PIN (Device Password) is not found in
21139beb93cSSam Leffler 	 * Registrar data.
21239beb93cSSam Leffler 	 */
21339beb93cSSam Leffler 	void (*pin_needed_cb)(void *ctx, const u8 *uuid_e,
21439beb93cSSam Leffler 			      const struct wps_device_data *dev);
21539beb93cSSam Leffler 
21639beb93cSSam Leffler 	/**
21739beb93cSSam Leffler 	 * reg_success_cb - Callback for reporting successful registration
21839beb93cSSam Leffler 	 * @ctx: Higher layer context data (cb_ctx)
21939beb93cSSam Leffler 	 * @mac_addr: MAC address of the Enrollee
22039beb93cSSam Leffler 	 * @uuid_e: UUID-E of the Enrollee
22139beb93cSSam Leffler 	 *
22239beb93cSSam Leffler 	 * This callback is called whenever an Enrollee completes registration
22339beb93cSSam Leffler 	 * successfully.
22439beb93cSSam Leffler 	 */
22539beb93cSSam Leffler 	void (*reg_success_cb)(void *ctx, const u8 *mac_addr,
22639beb93cSSam Leffler 			       const u8 *uuid_e);
22739beb93cSSam Leffler 
22839beb93cSSam Leffler 	/**
22939beb93cSSam Leffler 	 * cb_ctx: Higher layer context data for Registrar callbacks
23039beb93cSSam Leffler 	 */
23139beb93cSSam Leffler 	void *cb_ctx;
23239beb93cSSam Leffler 
23339beb93cSSam Leffler 	/**
23439beb93cSSam Leffler 	 * skip_cred_build: Do not build credential
23539beb93cSSam Leffler 	 *
23639beb93cSSam Leffler 	 * This option can be used to disable internal code that builds
23739beb93cSSam Leffler 	 * Credential attribute into M8 based on the current network
23839beb93cSSam Leffler 	 * configuration and Enrollee capabilities. The extra_cred data will
23939beb93cSSam Leffler 	 * then be used as the Credential(s).
24039beb93cSSam Leffler 	 */
24139beb93cSSam Leffler 	int skip_cred_build;
24239beb93cSSam Leffler 
24339beb93cSSam Leffler 	/**
24439beb93cSSam Leffler 	 * extra_cred: Additional Credential attribute(s)
24539beb93cSSam Leffler 	 *
24639beb93cSSam Leffler 	 * This optional data (set to %NULL to disable) can be used to add
24739beb93cSSam Leffler 	 * Credential attribute(s) for other networks into M8. If
24839beb93cSSam Leffler 	 * skip_cred_build is set, this will also override the automatically
24939beb93cSSam Leffler 	 * generated Credential attribute.
25039beb93cSSam Leffler 	 */
25139beb93cSSam Leffler 	const u8 *extra_cred;
25239beb93cSSam Leffler 
25339beb93cSSam Leffler 	/**
25439beb93cSSam Leffler 	 * extra_cred_len: Length of extra_cred in octets
25539beb93cSSam Leffler 	 */
25639beb93cSSam Leffler 	size_t extra_cred_len;
25739beb93cSSam Leffler 
25839beb93cSSam Leffler 	/**
25939beb93cSSam Leffler 	 * disable_auto_conf - Disable auto-configuration on first registration
26039beb93cSSam Leffler 	 *
26139beb93cSSam Leffler 	 * By default, the AP that is started in not configured state will
26239beb93cSSam Leffler 	 * generate a random PSK and move to configured state when the first
26339beb93cSSam Leffler 	 * registration protocol run is completed successfully. This option can
26439beb93cSSam Leffler 	 * be used to disable this functionality and leave it up to an external
26539beb93cSSam Leffler 	 * program to take care of configuration. This requires the extra_cred
26639beb93cSSam Leffler 	 * to be set with a suitable Credential and skip_cred_build being used.
26739beb93cSSam Leffler 	 */
26839beb93cSSam Leffler 	int disable_auto_conf;
26939beb93cSSam Leffler };
27039beb93cSSam Leffler 
27139beb93cSSam Leffler 
27239beb93cSSam Leffler /**
27339beb93cSSam Leffler  * enum wps_event - WPS event types
27439beb93cSSam Leffler  */
27539beb93cSSam Leffler enum wps_event {
27639beb93cSSam Leffler 	/**
27739beb93cSSam Leffler 	 * WPS_EV_M2D - M2D received (Registrar did not know us)
27839beb93cSSam Leffler 	 */
27939beb93cSSam Leffler 	WPS_EV_M2D,
28039beb93cSSam Leffler 
28139beb93cSSam Leffler 	/**
28239beb93cSSam Leffler 	 * WPS_EV_FAIL - Registration failed
28339beb93cSSam Leffler 	 */
28439beb93cSSam Leffler 	WPS_EV_FAIL,
28539beb93cSSam Leffler 
28639beb93cSSam Leffler 	/**
28739beb93cSSam Leffler 	 * WPS_EV_SUCCESS - Registration succeeded
28839beb93cSSam Leffler 	 */
28939beb93cSSam Leffler 	WPS_EV_SUCCESS,
29039beb93cSSam Leffler 
29139beb93cSSam Leffler 	/**
29239beb93cSSam Leffler 	 * WPS_EV_PWD_AUTH_FAIL - Password authentication failed
29339beb93cSSam Leffler 	 */
29439beb93cSSam Leffler 	WPS_EV_PWD_AUTH_FAIL
29539beb93cSSam Leffler };
29639beb93cSSam Leffler 
29739beb93cSSam Leffler /**
29839beb93cSSam Leffler  * union wps_event_data - WPS event data
29939beb93cSSam Leffler  */
30039beb93cSSam Leffler union wps_event_data {
30139beb93cSSam Leffler 	/**
30239beb93cSSam Leffler 	 * struct wps_event_m2d - M2D event data
30339beb93cSSam Leffler 	 */
30439beb93cSSam Leffler 	struct wps_event_m2d {
30539beb93cSSam Leffler 		u16 config_methods;
30639beb93cSSam Leffler 		const u8 *manufacturer;
30739beb93cSSam Leffler 		size_t manufacturer_len;
30839beb93cSSam Leffler 		const u8 *model_name;
30939beb93cSSam Leffler 		size_t model_name_len;
31039beb93cSSam Leffler 		const u8 *model_number;
31139beb93cSSam Leffler 		size_t model_number_len;
31239beb93cSSam Leffler 		const u8 *serial_number;
31339beb93cSSam Leffler 		size_t serial_number_len;
31439beb93cSSam Leffler 		const u8 *dev_name;
31539beb93cSSam Leffler 		size_t dev_name_len;
31639beb93cSSam Leffler 		const u8 *primary_dev_type; /* 8 octets */
31739beb93cSSam Leffler 		u16 config_error;
31839beb93cSSam Leffler 		u16 dev_password_id;
31939beb93cSSam Leffler 	} m2d;
32039beb93cSSam Leffler 
32139beb93cSSam Leffler 	/**
32239beb93cSSam Leffler 	 * struct wps_event_fail - Registration failure information
32339beb93cSSam Leffler 	 * @msg: enum wps_msg_type
32439beb93cSSam Leffler 	 */
32539beb93cSSam Leffler 	struct wps_event_fail {
32639beb93cSSam Leffler 		int msg;
32739beb93cSSam Leffler 	} fail;
32839beb93cSSam Leffler 
32939beb93cSSam Leffler 	struct wps_event_pwd_auth_fail {
33039beb93cSSam Leffler 		int enrollee;
33139beb93cSSam Leffler 		int part;
33239beb93cSSam Leffler 	} pwd_auth_fail;
33339beb93cSSam Leffler };
33439beb93cSSam Leffler 
33539beb93cSSam Leffler /**
33639beb93cSSam Leffler  * struct upnp_pending_message - Pending PutWLANResponse messages
33739beb93cSSam Leffler  * @next: Pointer to next pending message or %NULL
33839beb93cSSam Leffler  * @addr: NewWLANEventMAC
33939beb93cSSam Leffler  * @msg: NewMessage
34039beb93cSSam Leffler  * @type: Message Type
34139beb93cSSam Leffler  */
34239beb93cSSam Leffler struct upnp_pending_message {
34339beb93cSSam Leffler 	struct upnp_pending_message *next;
34439beb93cSSam Leffler 	u8 addr[ETH_ALEN];
34539beb93cSSam Leffler 	struct wpabuf *msg;
34639beb93cSSam Leffler 	enum wps_msg_type type;
34739beb93cSSam Leffler };
34839beb93cSSam Leffler 
34939beb93cSSam Leffler /**
35039beb93cSSam Leffler  * struct wps_context - Long term WPS context data
35139beb93cSSam Leffler  *
35239beb93cSSam Leffler  * This data is stored at the higher layer Authenticator or Supplicant data
35339beb93cSSam Leffler  * structures and it is maintained over multiple registration protocol runs.
35439beb93cSSam Leffler  */
35539beb93cSSam Leffler struct wps_context {
35639beb93cSSam Leffler 	/**
35739beb93cSSam Leffler 	 * ap - Whether the local end is an access point
35839beb93cSSam Leffler 	 */
35939beb93cSSam Leffler 	int ap;
36039beb93cSSam Leffler 
36139beb93cSSam Leffler 	/**
36239beb93cSSam Leffler 	 * registrar - Pointer to WPS registrar data from wps_registrar_init()
36339beb93cSSam Leffler 	 */
36439beb93cSSam Leffler 	struct wps_registrar *registrar;
36539beb93cSSam Leffler 
36639beb93cSSam Leffler 	/**
36739beb93cSSam Leffler 	 * wps_state - Current WPS state
36839beb93cSSam Leffler 	 */
36939beb93cSSam Leffler 	enum wps_state wps_state;
37039beb93cSSam Leffler 
37139beb93cSSam Leffler 	/**
37239beb93cSSam Leffler 	 * ap_setup_locked - Whether AP setup is locked (only used at AP)
37339beb93cSSam Leffler 	 */
37439beb93cSSam Leffler 	int ap_setup_locked;
37539beb93cSSam Leffler 
37639beb93cSSam Leffler 	/**
37739beb93cSSam Leffler 	 * uuid - Own UUID
37839beb93cSSam Leffler 	 */
37939beb93cSSam Leffler 	u8 uuid[16];
38039beb93cSSam Leffler 
38139beb93cSSam Leffler 	/**
38239beb93cSSam Leffler 	 * ssid - SSID
38339beb93cSSam Leffler 	 *
38439beb93cSSam Leffler 	 * This SSID is used by the Registrar to fill in information for
38539beb93cSSam Leffler 	 * Credentials. In addition, AP uses it when acting as an Enrollee to
38639beb93cSSam Leffler 	 * notify Registrar of the current configuration.
38739beb93cSSam Leffler 	 */
38839beb93cSSam Leffler 	u8 ssid[32];
38939beb93cSSam Leffler 
39039beb93cSSam Leffler 	/**
39139beb93cSSam Leffler 	 * ssid_len - Length of ssid in octets
39239beb93cSSam Leffler 	 */
39339beb93cSSam Leffler 	size_t ssid_len;
39439beb93cSSam Leffler 
39539beb93cSSam Leffler 	/**
39639beb93cSSam Leffler 	 * dev - Own WPS device data
39739beb93cSSam Leffler 	 */
39839beb93cSSam Leffler 	struct wps_device_data dev;
39939beb93cSSam Leffler 
40039beb93cSSam Leffler 	/**
40139beb93cSSam Leffler 	 * config_methods - Enabled configuration methods
40239beb93cSSam Leffler 	 *
40339beb93cSSam Leffler 	 * Bit field of WPS_CONFIG_*
40439beb93cSSam Leffler 	 */
40539beb93cSSam Leffler 	u16 config_methods;
40639beb93cSSam Leffler 
40739beb93cSSam Leffler 	/**
40839beb93cSSam Leffler 	 * encr_types - Enabled encryption types (bit field of WPS_ENCR_*)
40939beb93cSSam Leffler 	 */
41039beb93cSSam Leffler 	u16 encr_types;
41139beb93cSSam Leffler 
41239beb93cSSam Leffler 	/**
41339beb93cSSam Leffler 	 * auth_types - Authentication types (bit field of WPS_AUTH_*)
41439beb93cSSam Leffler 	 */
41539beb93cSSam Leffler 	u16 auth_types;
41639beb93cSSam Leffler 
41739beb93cSSam Leffler 	/**
41839beb93cSSam Leffler 	 * network_key - The current Network Key (PSK) or %NULL to generate new
41939beb93cSSam Leffler 	 *
42039beb93cSSam Leffler 	 * If %NULL, Registrar will generate per-device PSK. In addition, AP
42139beb93cSSam Leffler 	 * uses this when acting as an Enrollee to notify Registrar of the
42239beb93cSSam Leffler 	 * current configuration.
42339beb93cSSam Leffler 	 */
42439beb93cSSam Leffler 	u8 *network_key;
42539beb93cSSam Leffler 
42639beb93cSSam Leffler 	/**
42739beb93cSSam Leffler 	 * network_key_len - Length of network_key in octets
42839beb93cSSam Leffler 	 */
42939beb93cSSam Leffler 	size_t network_key_len;
43039beb93cSSam Leffler 
43139beb93cSSam Leffler 	/**
43239beb93cSSam Leffler 	 * ap_settings - AP Settings override for M7 (only used at AP)
43339beb93cSSam Leffler 	 *
43439beb93cSSam Leffler 	 * If %NULL, AP Settings attributes will be generated based on the
43539beb93cSSam Leffler 	 * current network configuration.
43639beb93cSSam Leffler 	 */
43739beb93cSSam Leffler 	u8 *ap_settings;
43839beb93cSSam Leffler 
43939beb93cSSam Leffler 	/**
44039beb93cSSam Leffler 	 * ap_settings_len - Length of ap_settings in octets
44139beb93cSSam Leffler 	 */
44239beb93cSSam Leffler 	size_t ap_settings_len;
44339beb93cSSam Leffler 
44439beb93cSSam Leffler 	/**
44539beb93cSSam Leffler 	 * friendly_name - Friendly Name (required for UPnP)
44639beb93cSSam Leffler 	 */
44739beb93cSSam Leffler 	char *friendly_name;
44839beb93cSSam Leffler 
44939beb93cSSam Leffler 	/**
45039beb93cSSam Leffler 	 * manufacturer_url - Manufacturer URL (optional for UPnP)
45139beb93cSSam Leffler 	 */
45239beb93cSSam Leffler 	char *manufacturer_url;
45339beb93cSSam Leffler 
45439beb93cSSam Leffler 	/**
45539beb93cSSam Leffler 	 * model_description - Model Description (recommended for UPnP)
45639beb93cSSam Leffler 	 */
45739beb93cSSam Leffler 	char *model_description;
45839beb93cSSam Leffler 
45939beb93cSSam Leffler 	/**
46039beb93cSSam Leffler 	 * model_url - Model URL (optional for UPnP)
46139beb93cSSam Leffler 	 */
46239beb93cSSam Leffler 	char *model_url;
46339beb93cSSam Leffler 
46439beb93cSSam Leffler 	/**
46539beb93cSSam Leffler 	 * upc - Universal Product Code (optional for UPnP)
46639beb93cSSam Leffler 	 */
46739beb93cSSam Leffler 	char *upc;
46839beb93cSSam Leffler 
46939beb93cSSam Leffler 	/**
47039beb93cSSam Leffler 	 * cred_cb - Callback to notify that new Credentials were received
47139beb93cSSam Leffler 	 * @ctx: Higher layer context data (cb_ctx)
47239beb93cSSam Leffler 	 * @cred: The received Credential
47339beb93cSSam Leffler 	 * Return: 0 on success, -1 on failure
47439beb93cSSam Leffler 	 */
47539beb93cSSam Leffler 	int (*cred_cb)(void *ctx, const struct wps_credential *cred);
47639beb93cSSam Leffler 
47739beb93cSSam Leffler 	/**
47839beb93cSSam Leffler 	 * event_cb - Event callback (state information about progress)
47939beb93cSSam Leffler 	 * @ctx: Higher layer context data (cb_ctx)
48039beb93cSSam Leffler 	 * @event: Event type
48139beb93cSSam Leffler 	 * @data: Event data
48239beb93cSSam Leffler 	 */
48339beb93cSSam Leffler 	void (*event_cb)(void *ctx, enum wps_event event,
48439beb93cSSam Leffler 			 union wps_event_data *data);
48539beb93cSSam Leffler 
48639beb93cSSam Leffler 	/**
48739beb93cSSam Leffler 	 * cb_ctx: Higher layer context data for callbacks
48839beb93cSSam Leffler 	 */
48939beb93cSSam Leffler 	void *cb_ctx;
49039beb93cSSam Leffler 
49139beb93cSSam Leffler 	struct upnp_wps_device_sm *wps_upnp;
49239beb93cSSam Leffler 
49339beb93cSSam Leffler 	/* Pending messages from UPnP PutWLANResponse */
49439beb93cSSam Leffler 	struct upnp_pending_message *upnp_msgs;
49539beb93cSSam Leffler };
49639beb93cSSam Leffler 
49739beb93cSSam Leffler 
49839beb93cSSam Leffler struct wps_registrar *
49939beb93cSSam Leffler wps_registrar_init(struct wps_context *wps,
50039beb93cSSam Leffler 		   const struct wps_registrar_config *cfg);
50139beb93cSSam Leffler void wps_registrar_deinit(struct wps_registrar *reg);
50239beb93cSSam Leffler int wps_registrar_add_pin(struct wps_registrar *reg, const u8 *uuid,
50339beb93cSSam Leffler 			  const u8 *pin, size_t pin_len);
50439beb93cSSam Leffler int wps_registrar_invalidate_pin(struct wps_registrar *reg, const u8 *uuid);
50539beb93cSSam Leffler int wps_registrar_unlock_pin(struct wps_registrar *reg, const u8 *uuid);
50639beb93cSSam Leffler int wps_registrar_button_pushed(struct wps_registrar *reg);
50739beb93cSSam Leffler void wps_registrar_probe_req_rx(struct wps_registrar *reg, const u8 *addr,
50839beb93cSSam Leffler 				const struct wpabuf *wps_data);
50939beb93cSSam Leffler int wps_registrar_update_ie(struct wps_registrar *reg);
51039beb93cSSam Leffler int wps_registrar_set_selected_registrar(struct wps_registrar *reg,
51139beb93cSSam Leffler 					 const struct wpabuf *msg);
51239beb93cSSam Leffler 
51339beb93cSSam Leffler unsigned int wps_pin_checksum(unsigned int pin);
51439beb93cSSam Leffler unsigned int wps_pin_valid(unsigned int pin);
51539beb93cSSam Leffler unsigned int wps_generate_pin(void);
51639beb93cSSam Leffler void wps_free_pending_msgs(struct upnp_pending_message *msgs);
51739beb93cSSam Leffler 
51839beb93cSSam Leffler #endif /* WPS_H */
519