1*03f9172cSAndroid Build Coastguard Worker /*
2*03f9172cSAndroid Build Coastguard Worker * Wi-Fi Protected Setup
3*03f9172cSAndroid Build Coastguard Worker * Copyright (c) 2007-2016, Jouni Malinen <[email protected]>
4*03f9172cSAndroid Build Coastguard Worker *
5*03f9172cSAndroid Build Coastguard Worker * This software may be distributed under the terms of the BSD license.
6*03f9172cSAndroid Build Coastguard Worker * See README for more details.
7*03f9172cSAndroid Build Coastguard Worker */
8*03f9172cSAndroid Build Coastguard Worker
9*03f9172cSAndroid Build Coastguard Worker #ifndef WPS_H
10*03f9172cSAndroid Build Coastguard Worker #define WPS_H
11*03f9172cSAndroid Build Coastguard Worker
12*03f9172cSAndroid Build Coastguard Worker #include "common/ieee802_11_defs.h"
13*03f9172cSAndroid Build Coastguard Worker #include "wps_defs.h"
14*03f9172cSAndroid Build Coastguard Worker
15*03f9172cSAndroid Build Coastguard Worker /**
16*03f9172cSAndroid Build Coastguard Worker * enum wsc_op_code - EAP-WSC OP-Code values
17*03f9172cSAndroid Build Coastguard Worker */
18*03f9172cSAndroid Build Coastguard Worker enum wsc_op_code {
19*03f9172cSAndroid Build Coastguard Worker WSC_UPnP = 0 /* No OP Code in UPnP transport */,
20*03f9172cSAndroid Build Coastguard Worker WSC_Start = 0x01,
21*03f9172cSAndroid Build Coastguard Worker WSC_ACK = 0x02,
22*03f9172cSAndroid Build Coastguard Worker WSC_NACK = 0x03,
23*03f9172cSAndroid Build Coastguard Worker WSC_MSG = 0x04,
24*03f9172cSAndroid Build Coastguard Worker WSC_Done = 0x05,
25*03f9172cSAndroid Build Coastguard Worker WSC_FRAG_ACK = 0x06
26*03f9172cSAndroid Build Coastguard Worker };
27*03f9172cSAndroid Build Coastguard Worker
28*03f9172cSAndroid Build Coastguard Worker struct wps_registrar;
29*03f9172cSAndroid Build Coastguard Worker struct upnp_wps_device_sm;
30*03f9172cSAndroid Build Coastguard Worker struct wps_er;
31*03f9172cSAndroid Build Coastguard Worker struct wps_parse_attr;
32*03f9172cSAndroid Build Coastguard Worker
33*03f9172cSAndroid Build Coastguard Worker /**
34*03f9172cSAndroid Build Coastguard Worker * struct wps_credential - WPS Credential
35*03f9172cSAndroid Build Coastguard Worker * @ssid: SSID
36*03f9172cSAndroid Build Coastguard Worker * @ssid_len: Length of SSID
37*03f9172cSAndroid Build Coastguard Worker * @auth_type: Authentication Type (WPS_AUTH_OPEN, .. flags)
38*03f9172cSAndroid Build Coastguard Worker * @encr_type: Encryption Type (WPS_ENCR_NONE, .. flags)
39*03f9172cSAndroid Build Coastguard Worker * @key_idx: Key index
40*03f9172cSAndroid Build Coastguard Worker * @key: Key
41*03f9172cSAndroid Build Coastguard Worker * @key_len: Key length in octets
42*03f9172cSAndroid Build Coastguard Worker * @mac_addr: MAC address of the Credential receiver
43*03f9172cSAndroid Build Coastguard Worker * @cred_attr: Unparsed Credential attribute data (used only in cred_cb());
44*03f9172cSAndroid Build Coastguard Worker * this may be %NULL, if not used
45*03f9172cSAndroid Build Coastguard Worker * @cred_attr_len: Length of cred_attr in octets
46*03f9172cSAndroid Build Coastguard Worker */
47*03f9172cSAndroid Build Coastguard Worker struct wps_credential {
48*03f9172cSAndroid Build Coastguard Worker u8 ssid[SSID_MAX_LEN];
49*03f9172cSAndroid Build Coastguard Worker size_t ssid_len;
50*03f9172cSAndroid Build Coastguard Worker u16 auth_type;
51*03f9172cSAndroid Build Coastguard Worker u16 encr_type;
52*03f9172cSAndroid Build Coastguard Worker u8 key_idx;
53*03f9172cSAndroid Build Coastguard Worker u8 key[64];
54*03f9172cSAndroid Build Coastguard Worker size_t key_len;
55*03f9172cSAndroid Build Coastguard Worker u8 mac_addr[ETH_ALEN];
56*03f9172cSAndroid Build Coastguard Worker const u8 *cred_attr;
57*03f9172cSAndroid Build Coastguard Worker size_t cred_attr_len;
58*03f9172cSAndroid Build Coastguard Worker };
59*03f9172cSAndroid Build Coastguard Worker
60*03f9172cSAndroid Build Coastguard Worker #define WPS_DEV_TYPE_LEN 8
61*03f9172cSAndroid Build Coastguard Worker #define WPS_DEV_TYPE_BUFSIZE 21
62*03f9172cSAndroid Build Coastguard Worker #define WPS_SEC_DEV_TYPE_MAX_LEN 128
63*03f9172cSAndroid Build Coastguard Worker /* maximum number of advertised WPS vendor extension attributes */
64*03f9172cSAndroid Build Coastguard Worker #define MAX_WPS_VENDOR_EXTENSIONS 10
65*03f9172cSAndroid Build Coastguard Worker /* maximum size of WPS Vendor extension attribute */
66*03f9172cSAndroid Build Coastguard Worker #define WPS_MAX_VENDOR_EXT_LEN 1024
67*03f9172cSAndroid Build Coastguard Worker /* maximum number of parsed WPS vendor extension attributes */
68*03f9172cSAndroid Build Coastguard Worker #define MAX_WPS_PARSE_VENDOR_EXT 10
69*03f9172cSAndroid Build Coastguard Worker
70*03f9172cSAndroid Build Coastguard Worker /**
71*03f9172cSAndroid Build Coastguard Worker * struct wps_device_data - WPS Device Data
72*03f9172cSAndroid Build Coastguard Worker * @mac_addr: Device MAC address
73*03f9172cSAndroid Build Coastguard Worker * @device_name: Device Name (0..32 octets encoded in UTF-8)
74*03f9172cSAndroid Build Coastguard Worker * @manufacturer: Manufacturer (0..64 octets encoded in UTF-8)
75*03f9172cSAndroid Build Coastguard Worker * @model_name: Model Name (0..32 octets encoded in UTF-8)
76*03f9172cSAndroid Build Coastguard Worker * @model_number: Model Number (0..32 octets encoded in UTF-8)
77*03f9172cSAndroid Build Coastguard Worker * @serial_number: Serial Number (0..32 octets encoded in UTF-8)
78*03f9172cSAndroid Build Coastguard Worker * @pri_dev_type: Primary Device Type
79*03f9172cSAndroid Build Coastguard Worker * @sec_dev_type: Array of secondary device types
80*03f9172cSAndroid Build Coastguard Worker * @num_sec_dev_type: Number of secondary device types
81*03f9172cSAndroid Build Coastguard Worker * @os_version: OS Version
82*03f9172cSAndroid Build Coastguard Worker * @rf_bands: RF bands (WPS_RF_24GHZ, WPS_RF_50GHZ, WPS_RF_60GHZ flags)
83*03f9172cSAndroid Build Coastguard Worker * @p2p: Whether the device is a P2P device
84*03f9172cSAndroid Build Coastguard Worker */
85*03f9172cSAndroid Build Coastguard Worker struct wps_device_data {
86*03f9172cSAndroid Build Coastguard Worker u8 mac_addr[ETH_ALEN];
87*03f9172cSAndroid Build Coastguard Worker char *device_name;
88*03f9172cSAndroid Build Coastguard Worker char *manufacturer;
89*03f9172cSAndroid Build Coastguard Worker char *model_name;
90*03f9172cSAndroid Build Coastguard Worker char *model_number;
91*03f9172cSAndroid Build Coastguard Worker char *serial_number;
92*03f9172cSAndroid Build Coastguard Worker u8 pri_dev_type[WPS_DEV_TYPE_LEN];
93*03f9172cSAndroid Build Coastguard Worker #define WPS_SEC_DEVICE_TYPES 5
94*03f9172cSAndroid Build Coastguard Worker u8 sec_dev_type[WPS_SEC_DEVICE_TYPES][WPS_DEV_TYPE_LEN];
95*03f9172cSAndroid Build Coastguard Worker u8 num_sec_dev_types;
96*03f9172cSAndroid Build Coastguard Worker u32 os_version;
97*03f9172cSAndroid Build Coastguard Worker u8 rf_bands;
98*03f9172cSAndroid Build Coastguard Worker u16 config_methods;
99*03f9172cSAndroid Build Coastguard Worker struct wpabuf *vendor_ext_m1;
100*03f9172cSAndroid Build Coastguard Worker struct wpabuf *vendor_ext[MAX_WPS_VENDOR_EXTENSIONS];
101*03f9172cSAndroid Build Coastguard Worker struct wpabuf *application_ext;
102*03f9172cSAndroid Build Coastguard Worker
103*03f9172cSAndroid Build Coastguard Worker int p2p;
104*03f9172cSAndroid Build Coastguard Worker u8 multi_ap_ext;
105*03f9172cSAndroid Build Coastguard Worker };
106*03f9172cSAndroid Build Coastguard Worker
107*03f9172cSAndroid Build Coastguard Worker /**
108*03f9172cSAndroid Build Coastguard Worker * struct wps_config - WPS configuration for a single registration protocol run
109*03f9172cSAndroid Build Coastguard Worker */
110*03f9172cSAndroid Build Coastguard Worker struct wps_config {
111*03f9172cSAndroid Build Coastguard Worker /**
112*03f9172cSAndroid Build Coastguard Worker * wps - Pointer to long term WPS context
113*03f9172cSAndroid Build Coastguard Worker */
114*03f9172cSAndroid Build Coastguard Worker struct wps_context *wps;
115*03f9172cSAndroid Build Coastguard Worker
116*03f9172cSAndroid Build Coastguard Worker /**
117*03f9172cSAndroid Build Coastguard Worker * registrar - Whether this end is a Registrar
118*03f9172cSAndroid Build Coastguard Worker */
119*03f9172cSAndroid Build Coastguard Worker int registrar;
120*03f9172cSAndroid Build Coastguard Worker
121*03f9172cSAndroid Build Coastguard Worker /**
122*03f9172cSAndroid Build Coastguard Worker * pin - Enrollee Device Password (%NULL for Registrar or PBC)
123*03f9172cSAndroid Build Coastguard Worker */
124*03f9172cSAndroid Build Coastguard Worker const u8 *pin;
125*03f9172cSAndroid Build Coastguard Worker
126*03f9172cSAndroid Build Coastguard Worker /**
127*03f9172cSAndroid Build Coastguard Worker * pin_len - Length on pin in octets
128*03f9172cSAndroid Build Coastguard Worker */
129*03f9172cSAndroid Build Coastguard Worker size_t pin_len;
130*03f9172cSAndroid Build Coastguard Worker
131*03f9172cSAndroid Build Coastguard Worker /**
132*03f9172cSAndroid Build Coastguard Worker * pbc - Whether this is protocol run uses PBC
133*03f9172cSAndroid Build Coastguard Worker */
134*03f9172cSAndroid Build Coastguard Worker int pbc;
135*03f9172cSAndroid Build Coastguard Worker
136*03f9172cSAndroid Build Coastguard Worker /**
137*03f9172cSAndroid Build Coastguard Worker * assoc_wps_ie: (Re)AssocReq WPS IE (in AP; %NULL if not AP)
138*03f9172cSAndroid Build Coastguard Worker */
139*03f9172cSAndroid Build Coastguard Worker const struct wpabuf *assoc_wps_ie;
140*03f9172cSAndroid Build Coastguard Worker
141*03f9172cSAndroid Build Coastguard Worker /**
142*03f9172cSAndroid Build Coastguard Worker * new_ap_settings - New AP settings (%NULL if not used)
143*03f9172cSAndroid Build Coastguard Worker *
144*03f9172cSAndroid Build Coastguard Worker * This parameter provides new AP settings when using a wireless
145*03f9172cSAndroid Build Coastguard Worker * stations as a Registrar to configure the AP. %NULL means that AP
146*03f9172cSAndroid Build Coastguard Worker * will not be reconfigured, i.e., the station will only learn the
147*03f9172cSAndroid Build Coastguard Worker * current AP settings by using AP PIN.
148*03f9172cSAndroid Build Coastguard Worker */
149*03f9172cSAndroid Build Coastguard Worker const struct wps_credential *new_ap_settings;
150*03f9172cSAndroid Build Coastguard Worker
151*03f9172cSAndroid Build Coastguard Worker /**
152*03f9172cSAndroid Build Coastguard Worker * peer_addr: MAC address of the peer in AP; %NULL if not AP
153*03f9172cSAndroid Build Coastguard Worker */
154*03f9172cSAndroid Build Coastguard Worker const u8 *peer_addr;
155*03f9172cSAndroid Build Coastguard Worker
156*03f9172cSAndroid Build Coastguard Worker /**
157*03f9172cSAndroid Build Coastguard Worker * use_psk_key - Use PSK format key in Credential
158*03f9172cSAndroid Build Coastguard Worker *
159*03f9172cSAndroid Build Coastguard Worker * Force PSK format to be used instead of ASCII passphrase when
160*03f9172cSAndroid Build Coastguard Worker * building Credential for an Enrollee. The PSK value is set in
161*03f9172cSAndroid Build Coastguard Worker * struct wpa_context::psk.
162*03f9172cSAndroid Build Coastguard Worker */
163*03f9172cSAndroid Build Coastguard Worker int use_psk_key;
164*03f9172cSAndroid Build Coastguard Worker
165*03f9172cSAndroid Build Coastguard Worker /**
166*03f9172cSAndroid Build Coastguard Worker * dev_pw_id - Device Password ID for Enrollee when PIN is used
167*03f9172cSAndroid Build Coastguard Worker */
168*03f9172cSAndroid Build Coastguard Worker u16 dev_pw_id;
169*03f9172cSAndroid Build Coastguard Worker
170*03f9172cSAndroid Build Coastguard Worker /**
171*03f9172cSAndroid Build Coastguard Worker * p2p_dev_addr - P2P Device Address from (Re)Association Request
172*03f9172cSAndroid Build Coastguard Worker *
173*03f9172cSAndroid Build Coastguard Worker * On AP/GO, this is set to the P2P Device Address of the associating
174*03f9172cSAndroid Build Coastguard Worker * P2P client if a P2P IE is included in the (Re)Association Request
175*03f9172cSAndroid Build Coastguard Worker * frame and the P2P Device Address is included. Otherwise, this is set
176*03f9172cSAndroid Build Coastguard Worker * to %NULL to indicate the station does not have a P2P Device Address.
177*03f9172cSAndroid Build Coastguard Worker */
178*03f9172cSAndroid Build Coastguard Worker const u8 *p2p_dev_addr;
179*03f9172cSAndroid Build Coastguard Worker
180*03f9172cSAndroid Build Coastguard Worker /**
181*03f9172cSAndroid Build Coastguard Worker * pbc_in_m1 - Do not remove PushButton config method in M1 (AP)
182*03f9172cSAndroid Build Coastguard Worker *
183*03f9172cSAndroid Build Coastguard Worker * This can be used to enable a workaround to allow Windows 7 to use
184*03f9172cSAndroid Build Coastguard Worker * PBC with the AP.
185*03f9172cSAndroid Build Coastguard Worker */
186*03f9172cSAndroid Build Coastguard Worker int pbc_in_m1;
187*03f9172cSAndroid Build Coastguard Worker
188*03f9172cSAndroid Build Coastguard Worker /**
189*03f9172cSAndroid Build Coastguard Worker * peer_pubkey_hash - Peer public key hash or %NULL if not known
190*03f9172cSAndroid Build Coastguard Worker */
191*03f9172cSAndroid Build Coastguard Worker const u8 *peer_pubkey_hash;
192*03f9172cSAndroid Build Coastguard Worker
193*03f9172cSAndroid Build Coastguard Worker /**
194*03f9172cSAndroid Build Coastguard Worker * multi_ap_backhaul_sta - Whether this is a Multi-AP backhaul STA
195*03f9172cSAndroid Build Coastguard Worker * enrollee
196*03f9172cSAndroid Build Coastguard Worker */
197*03f9172cSAndroid Build Coastguard Worker int multi_ap_backhaul_sta;
198*03f9172cSAndroid Build Coastguard Worker
199*03f9172cSAndroid Build Coastguard Worker /*
200*03f9172cSAndroid Build Coastguard Worker * multi_ap_profile - Get the Multi-AP Profile
201*03f9172cSAndroid Build Coastguard Worker */
202*03f9172cSAndroid Build Coastguard Worker int multi_ap_profile;
203*03f9172cSAndroid Build Coastguard Worker };
204*03f9172cSAndroid Build Coastguard Worker
205*03f9172cSAndroid Build Coastguard Worker struct wps_data * wps_init(const struct wps_config *cfg);
206*03f9172cSAndroid Build Coastguard Worker
207*03f9172cSAndroid Build Coastguard Worker void wps_deinit(struct wps_data *data);
208*03f9172cSAndroid Build Coastguard Worker
209*03f9172cSAndroid Build Coastguard Worker /**
210*03f9172cSAndroid Build Coastguard Worker * enum wps_process_res - WPS message processing result
211*03f9172cSAndroid Build Coastguard Worker */
212*03f9172cSAndroid Build Coastguard Worker enum wps_process_res {
213*03f9172cSAndroid Build Coastguard Worker /**
214*03f9172cSAndroid Build Coastguard Worker * WPS_DONE - Processing done
215*03f9172cSAndroid Build Coastguard Worker */
216*03f9172cSAndroid Build Coastguard Worker WPS_DONE,
217*03f9172cSAndroid Build Coastguard Worker
218*03f9172cSAndroid Build Coastguard Worker /**
219*03f9172cSAndroid Build Coastguard Worker * WPS_CONTINUE - Processing continues
220*03f9172cSAndroid Build Coastguard Worker */
221*03f9172cSAndroid Build Coastguard Worker WPS_CONTINUE,
222*03f9172cSAndroid Build Coastguard Worker
223*03f9172cSAndroid Build Coastguard Worker /**
224*03f9172cSAndroid Build Coastguard Worker * WPS_FAILURE - Processing failed
225*03f9172cSAndroid Build Coastguard Worker */
226*03f9172cSAndroid Build Coastguard Worker WPS_FAILURE,
227*03f9172cSAndroid Build Coastguard Worker
228*03f9172cSAndroid Build Coastguard Worker /**
229*03f9172cSAndroid Build Coastguard Worker * WPS_PENDING - Processing continues, but waiting for an external
230*03f9172cSAndroid Build Coastguard Worker * event (e.g., UPnP message from an external Registrar)
231*03f9172cSAndroid Build Coastguard Worker */
232*03f9172cSAndroid Build Coastguard Worker WPS_PENDING
233*03f9172cSAndroid Build Coastguard Worker };
234*03f9172cSAndroid Build Coastguard Worker enum wps_process_res wps_process_msg(struct wps_data *wps,
235*03f9172cSAndroid Build Coastguard Worker enum wsc_op_code op_code,
236*03f9172cSAndroid Build Coastguard Worker const struct wpabuf *msg);
237*03f9172cSAndroid Build Coastguard Worker
238*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wps_get_msg(struct wps_data *wps, enum wsc_op_code *op_code);
239*03f9172cSAndroid Build Coastguard Worker
240*03f9172cSAndroid Build Coastguard Worker int wps_is_selected_pbc_registrar(const struct wpabuf *msg);
241*03f9172cSAndroid Build Coastguard Worker int wps_is_selected_pin_registrar(const struct wpabuf *msg);
242*03f9172cSAndroid Build Coastguard Worker int wps_ap_priority_compar(const struct wpabuf *wps_a,
243*03f9172cSAndroid Build Coastguard Worker const struct wpabuf *wps_b);
244*03f9172cSAndroid Build Coastguard Worker int wps_is_addr_authorized(const struct wpabuf *msg, const u8 *addr,
245*03f9172cSAndroid Build Coastguard Worker int ver1_compat);
246*03f9172cSAndroid Build Coastguard Worker const u8 * wps_get_uuid_e(const struct wpabuf *msg);
247*03f9172cSAndroid Build Coastguard Worker int wps_is_20(const struct wpabuf *msg);
248*03f9172cSAndroid Build Coastguard Worker
249*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wps_build_assoc_req_ie(enum wps_request_type req_type);
250*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wps_build_assoc_resp_ie(void);
251*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wps_build_probe_req_ie(u16 pw_id, struct wps_device_data *dev,
252*03f9172cSAndroid Build Coastguard Worker const u8 *uuid,
253*03f9172cSAndroid Build Coastguard Worker enum wps_request_type req_type,
254*03f9172cSAndroid Build Coastguard Worker unsigned int num_req_dev_types,
255*03f9172cSAndroid Build Coastguard Worker const u8 *req_dev_types);
256*03f9172cSAndroid Build Coastguard Worker
257*03f9172cSAndroid Build Coastguard Worker
258*03f9172cSAndroid Build Coastguard Worker /**
259*03f9172cSAndroid Build Coastguard Worker * struct wps_registrar_config - WPS Registrar configuration
260*03f9172cSAndroid Build Coastguard Worker */
261*03f9172cSAndroid Build Coastguard Worker struct wps_registrar_config {
262*03f9172cSAndroid Build Coastguard Worker /**
263*03f9172cSAndroid Build Coastguard Worker * new_psk_cb - Callback for new PSK
264*03f9172cSAndroid Build Coastguard Worker * @ctx: Higher layer context data (cb_ctx)
265*03f9172cSAndroid Build Coastguard Worker * @mac_addr: MAC address of the Enrollee
266*03f9172cSAndroid Build Coastguard Worker * @p2p_dev_addr: P2P Device Address of the Enrollee or all zeros if not
267*03f9172cSAndroid Build Coastguard Worker * @psk: The new PSK
268*03f9172cSAndroid Build Coastguard Worker * @psk_len: The length of psk in octets
269*03f9172cSAndroid Build Coastguard Worker * Returns: 0 on success, -1 on failure
270*03f9172cSAndroid Build Coastguard Worker *
271*03f9172cSAndroid Build Coastguard Worker * This callback is called when a new per-device PSK is provisioned.
272*03f9172cSAndroid Build Coastguard Worker */
273*03f9172cSAndroid Build Coastguard Worker int (*new_psk_cb)(void *ctx, const u8 *mac_addr, const u8 *p2p_dev_addr,
274*03f9172cSAndroid Build Coastguard Worker const u8 *psk, size_t psk_len);
275*03f9172cSAndroid Build Coastguard Worker
276*03f9172cSAndroid Build Coastguard Worker /**
277*03f9172cSAndroid Build Coastguard Worker * set_ie_cb - Callback for WPS IE changes
278*03f9172cSAndroid Build Coastguard Worker * @ctx: Higher layer context data (cb_ctx)
279*03f9172cSAndroid Build Coastguard Worker * @beacon_ie: WPS IE for Beacon
280*03f9172cSAndroid Build Coastguard Worker * @probe_resp_ie: WPS IE for Probe Response
281*03f9172cSAndroid Build Coastguard Worker * Returns: 0 on success, -1 on failure
282*03f9172cSAndroid Build Coastguard Worker *
283*03f9172cSAndroid Build Coastguard Worker * This callback is called whenever the WPS IE in Beacon or Probe
284*03f9172cSAndroid Build Coastguard Worker * Response frames needs to be changed (AP only). Callee is responsible
285*03f9172cSAndroid Build Coastguard Worker * for freeing the buffers.
286*03f9172cSAndroid Build Coastguard Worker */
287*03f9172cSAndroid Build Coastguard Worker int (*set_ie_cb)(void *ctx, struct wpabuf *beacon_ie,
288*03f9172cSAndroid Build Coastguard Worker struct wpabuf *probe_resp_ie);
289*03f9172cSAndroid Build Coastguard Worker
290*03f9172cSAndroid Build Coastguard Worker /**
291*03f9172cSAndroid Build Coastguard Worker * pin_needed_cb - Callback for requesting a PIN
292*03f9172cSAndroid Build Coastguard Worker * @ctx: Higher layer context data (cb_ctx)
293*03f9172cSAndroid Build Coastguard Worker * @uuid_e: UUID-E of the unknown Enrollee
294*03f9172cSAndroid Build Coastguard Worker * @dev: Device Data from the unknown Enrollee
295*03f9172cSAndroid Build Coastguard Worker *
296*03f9172cSAndroid Build Coastguard Worker * This callback is called whenever an unknown Enrollee requests to use
297*03f9172cSAndroid Build Coastguard Worker * PIN method and a matching PIN (Device Password) is not found in
298*03f9172cSAndroid Build Coastguard Worker * Registrar data.
299*03f9172cSAndroid Build Coastguard Worker */
300*03f9172cSAndroid Build Coastguard Worker void (*pin_needed_cb)(void *ctx, const u8 *uuid_e,
301*03f9172cSAndroid Build Coastguard Worker const struct wps_device_data *dev);
302*03f9172cSAndroid Build Coastguard Worker
303*03f9172cSAndroid Build Coastguard Worker /**
304*03f9172cSAndroid Build Coastguard Worker * reg_success_cb - Callback for reporting successful registration
305*03f9172cSAndroid Build Coastguard Worker * @ctx: Higher layer context data (cb_ctx)
306*03f9172cSAndroid Build Coastguard Worker * @mac_addr: MAC address of the Enrollee
307*03f9172cSAndroid Build Coastguard Worker * @uuid_e: UUID-E of the Enrollee
308*03f9172cSAndroid Build Coastguard Worker * @dev_pw: Device Password (PIN) used during registration
309*03f9172cSAndroid Build Coastguard Worker * @dev_pw_len: Length of dev_pw in octets
310*03f9172cSAndroid Build Coastguard Worker *
311*03f9172cSAndroid Build Coastguard Worker * This callback is called whenever an Enrollee completes registration
312*03f9172cSAndroid Build Coastguard Worker * successfully.
313*03f9172cSAndroid Build Coastguard Worker */
314*03f9172cSAndroid Build Coastguard Worker void (*reg_success_cb)(void *ctx, const u8 *mac_addr,
315*03f9172cSAndroid Build Coastguard Worker const u8 *uuid_e, const u8 *dev_pw,
316*03f9172cSAndroid Build Coastguard Worker size_t dev_pw_len);
317*03f9172cSAndroid Build Coastguard Worker
318*03f9172cSAndroid Build Coastguard Worker /**
319*03f9172cSAndroid Build Coastguard Worker * set_sel_reg_cb - Callback for reporting selected registrar changes
320*03f9172cSAndroid Build Coastguard Worker * @ctx: Higher layer context data (cb_ctx)
321*03f9172cSAndroid Build Coastguard Worker * @sel_reg: Whether the Registrar is selected
322*03f9172cSAndroid Build Coastguard Worker * @dev_passwd_id: Device Password ID to indicate with method or
323*03f9172cSAndroid Build Coastguard Worker * specific password the Registrar intends to use
324*03f9172cSAndroid Build Coastguard Worker * @sel_reg_config_methods: Bit field of active config methods
325*03f9172cSAndroid Build Coastguard Worker *
326*03f9172cSAndroid Build Coastguard Worker * This callback is called whenever the Selected Registrar state
327*03f9172cSAndroid Build Coastguard Worker * changes (e.g., a new PIN becomes available or PBC is invoked). This
328*03f9172cSAndroid Build Coastguard Worker * callback is only used by External Registrar implementation;
329*03f9172cSAndroid Build Coastguard Worker * set_ie_cb() is used by AP implementation in similar caes, but it
330*03f9172cSAndroid Build Coastguard Worker * provides the full WPS IE data instead of just the minimal Registrar
331*03f9172cSAndroid Build Coastguard Worker * state information.
332*03f9172cSAndroid Build Coastguard Worker */
333*03f9172cSAndroid Build Coastguard Worker void (*set_sel_reg_cb)(void *ctx, int sel_reg, u16 dev_passwd_id,
334*03f9172cSAndroid Build Coastguard Worker u16 sel_reg_config_methods);
335*03f9172cSAndroid Build Coastguard Worker
336*03f9172cSAndroid Build Coastguard Worker /**
337*03f9172cSAndroid Build Coastguard Worker * enrollee_seen_cb - Callback for reporting Enrollee based on ProbeReq
338*03f9172cSAndroid Build Coastguard Worker * @ctx: Higher layer context data (cb_ctx)
339*03f9172cSAndroid Build Coastguard Worker * @addr: MAC address of the Enrollee
340*03f9172cSAndroid Build Coastguard Worker * @uuid_e: UUID of the Enrollee
341*03f9172cSAndroid Build Coastguard Worker * @pri_dev_type: Primary device type
342*03f9172cSAndroid Build Coastguard Worker * @config_methods: Config Methods
343*03f9172cSAndroid Build Coastguard Worker * @dev_password_id: Device Password ID
344*03f9172cSAndroid Build Coastguard Worker * @request_type: Request Type
345*03f9172cSAndroid Build Coastguard Worker * @dev_name: Device Name (if available)
346*03f9172cSAndroid Build Coastguard Worker */
347*03f9172cSAndroid Build Coastguard Worker void (*enrollee_seen_cb)(void *ctx, const u8 *addr, const u8 *uuid_e,
348*03f9172cSAndroid Build Coastguard Worker const u8 *pri_dev_type, u16 config_methods,
349*03f9172cSAndroid Build Coastguard Worker u16 dev_password_id, u8 request_type,
350*03f9172cSAndroid Build Coastguard Worker const char *dev_name);
351*03f9172cSAndroid Build Coastguard Worker
352*03f9172cSAndroid Build Coastguard Worker /**
353*03f9172cSAndroid Build Coastguard Worker * lookup_pskfile_cb - Callback for searching for PSK in wpa_psk_file
354*03f9172cSAndroid Build Coastguard Worker * @ctx: Higher layer context data (cb_ctx)
355*03f9172cSAndroid Build Coastguard Worker * @addr: Enrollee's MAC address
356*03f9172cSAndroid Build Coastguard Worker * @psk: Pointer to found PSK (output arg)
357*03f9172cSAndroid Build Coastguard Worker */
358*03f9172cSAndroid Build Coastguard Worker int (*lookup_pskfile_cb)(void *ctx, const u8 *mac_addr, const u8 **psk);
359*03f9172cSAndroid Build Coastguard Worker
360*03f9172cSAndroid Build Coastguard Worker /**
361*03f9172cSAndroid Build Coastguard Worker * cb_ctx: Higher layer context data for Registrar callbacks
362*03f9172cSAndroid Build Coastguard Worker */
363*03f9172cSAndroid Build Coastguard Worker void *cb_ctx;
364*03f9172cSAndroid Build Coastguard Worker
365*03f9172cSAndroid Build Coastguard Worker /**
366*03f9172cSAndroid Build Coastguard Worker * skip_cred_build: Do not build credential
367*03f9172cSAndroid Build Coastguard Worker *
368*03f9172cSAndroid Build Coastguard Worker * This option can be used to disable internal code that builds
369*03f9172cSAndroid Build Coastguard Worker * Credential attribute into M8 based on the current network
370*03f9172cSAndroid Build Coastguard Worker * configuration and Enrollee capabilities. The extra_cred data will
371*03f9172cSAndroid Build Coastguard Worker * then be used as the Credential(s).
372*03f9172cSAndroid Build Coastguard Worker */
373*03f9172cSAndroid Build Coastguard Worker int skip_cred_build;
374*03f9172cSAndroid Build Coastguard Worker
375*03f9172cSAndroid Build Coastguard Worker /**
376*03f9172cSAndroid Build Coastguard Worker * extra_cred: Additional Credential attribute(s)
377*03f9172cSAndroid Build Coastguard Worker *
378*03f9172cSAndroid Build Coastguard Worker * This optional data (set to %NULL to disable) can be used to add
379*03f9172cSAndroid Build Coastguard Worker * Credential attribute(s) for other networks into M8. If
380*03f9172cSAndroid Build Coastguard Worker * skip_cred_build is set, this will also override the automatically
381*03f9172cSAndroid Build Coastguard Worker * generated Credential attribute.
382*03f9172cSAndroid Build Coastguard Worker */
383*03f9172cSAndroid Build Coastguard Worker const u8 *extra_cred;
384*03f9172cSAndroid Build Coastguard Worker
385*03f9172cSAndroid Build Coastguard Worker /**
386*03f9172cSAndroid Build Coastguard Worker * extra_cred_len: Length of extra_cred in octets
387*03f9172cSAndroid Build Coastguard Worker */
388*03f9172cSAndroid Build Coastguard Worker size_t extra_cred_len;
389*03f9172cSAndroid Build Coastguard Worker
390*03f9172cSAndroid Build Coastguard Worker /**
391*03f9172cSAndroid Build Coastguard Worker * disable_auto_conf - Disable auto-configuration on first registration
392*03f9172cSAndroid Build Coastguard Worker *
393*03f9172cSAndroid Build Coastguard Worker * By default, the AP that is started in not configured state will
394*03f9172cSAndroid Build Coastguard Worker * generate a random PSK and move to configured state when the first
395*03f9172cSAndroid Build Coastguard Worker * registration protocol run is completed successfully. This option can
396*03f9172cSAndroid Build Coastguard Worker * be used to disable this functionality and leave it up to an external
397*03f9172cSAndroid Build Coastguard Worker * program to take care of configuration. This requires the extra_cred
398*03f9172cSAndroid Build Coastguard Worker * to be set with a suitable Credential and skip_cred_build being used.
399*03f9172cSAndroid Build Coastguard Worker */
400*03f9172cSAndroid Build Coastguard Worker int disable_auto_conf;
401*03f9172cSAndroid Build Coastguard Worker
402*03f9172cSAndroid Build Coastguard Worker /**
403*03f9172cSAndroid Build Coastguard Worker * dualband - Whether this is a concurrent dualband AP
404*03f9172cSAndroid Build Coastguard Worker */
405*03f9172cSAndroid Build Coastguard Worker int dualband;
406*03f9172cSAndroid Build Coastguard Worker
407*03f9172cSAndroid Build Coastguard Worker /**
408*03f9172cSAndroid Build Coastguard Worker * force_per_enrollee_psk - Force per-Enrollee random PSK
409*03f9172cSAndroid Build Coastguard Worker *
410*03f9172cSAndroid Build Coastguard Worker * This forces per-Enrollee random PSK to be generated even if a default
411*03f9172cSAndroid Build Coastguard Worker * PSK is set for a network.
412*03f9172cSAndroid Build Coastguard Worker */
413*03f9172cSAndroid Build Coastguard Worker int force_per_enrollee_psk;
414*03f9172cSAndroid Build Coastguard Worker
415*03f9172cSAndroid Build Coastguard Worker /**
416*03f9172cSAndroid Build Coastguard Worker * multi_ap_backhaul_ssid - SSID to supply to a Multi-AP backhaul
417*03f9172cSAndroid Build Coastguard Worker * enrollee
418*03f9172cSAndroid Build Coastguard Worker *
419*03f9172cSAndroid Build Coastguard Worker * This SSID is used by the Registrar to fill in information for
420*03f9172cSAndroid Build Coastguard Worker * Credentials when the enrollee advertises it is a Multi-AP backhaul
421*03f9172cSAndroid Build Coastguard Worker * STA.
422*03f9172cSAndroid Build Coastguard Worker */
423*03f9172cSAndroid Build Coastguard Worker const u8 *multi_ap_backhaul_ssid;
424*03f9172cSAndroid Build Coastguard Worker
425*03f9172cSAndroid Build Coastguard Worker /**
426*03f9172cSAndroid Build Coastguard Worker * multi_ap_backhaul_ssid_len - Length of multi_ap_backhaul_ssid in
427*03f9172cSAndroid Build Coastguard Worker * octets
428*03f9172cSAndroid Build Coastguard Worker */
429*03f9172cSAndroid Build Coastguard Worker size_t multi_ap_backhaul_ssid_len;
430*03f9172cSAndroid Build Coastguard Worker
431*03f9172cSAndroid Build Coastguard Worker /**
432*03f9172cSAndroid Build Coastguard Worker * multi_ap_backhaul_network_key - The Network Key (PSK) for the
433*03f9172cSAndroid Build Coastguard Worker * Multi-AP backhaul enrollee.
434*03f9172cSAndroid Build Coastguard Worker *
435*03f9172cSAndroid Build Coastguard Worker * This key can be either the ASCII passphrase (8..63 characters) or the
436*03f9172cSAndroid Build Coastguard Worker * 32-octet PSK (64 hex characters).
437*03f9172cSAndroid Build Coastguard Worker */
438*03f9172cSAndroid Build Coastguard Worker const u8 *multi_ap_backhaul_network_key;
439*03f9172cSAndroid Build Coastguard Worker
440*03f9172cSAndroid Build Coastguard Worker /**
441*03f9172cSAndroid Build Coastguard Worker * multi_ap_backhaul_network_key_len - Length of
442*03f9172cSAndroid Build Coastguard Worker * multi_ap_backhaul_network_key in octets
443*03f9172cSAndroid Build Coastguard Worker */
444*03f9172cSAndroid Build Coastguard Worker size_t multi_ap_backhaul_network_key_len;
445*03f9172cSAndroid Build Coastguard Worker };
446*03f9172cSAndroid Build Coastguard Worker
447*03f9172cSAndroid Build Coastguard Worker
448*03f9172cSAndroid Build Coastguard Worker /**
449*03f9172cSAndroid Build Coastguard Worker * enum wps_event - WPS event types
450*03f9172cSAndroid Build Coastguard Worker */
451*03f9172cSAndroid Build Coastguard Worker enum wps_event {
452*03f9172cSAndroid Build Coastguard Worker /**
453*03f9172cSAndroid Build Coastguard Worker * WPS_EV_M2D - M2D received (Registrar did not know us)
454*03f9172cSAndroid Build Coastguard Worker */
455*03f9172cSAndroid Build Coastguard Worker WPS_EV_M2D,
456*03f9172cSAndroid Build Coastguard Worker
457*03f9172cSAndroid Build Coastguard Worker /**
458*03f9172cSAndroid Build Coastguard Worker * WPS_EV_FAIL - Registration failed
459*03f9172cSAndroid Build Coastguard Worker */
460*03f9172cSAndroid Build Coastguard Worker WPS_EV_FAIL,
461*03f9172cSAndroid Build Coastguard Worker
462*03f9172cSAndroid Build Coastguard Worker /**
463*03f9172cSAndroid Build Coastguard Worker * WPS_EV_SUCCESS - Registration succeeded
464*03f9172cSAndroid Build Coastguard Worker */
465*03f9172cSAndroid Build Coastguard Worker WPS_EV_SUCCESS,
466*03f9172cSAndroid Build Coastguard Worker
467*03f9172cSAndroid Build Coastguard Worker /**
468*03f9172cSAndroid Build Coastguard Worker * WPS_EV_PWD_AUTH_FAIL - Password authentication failed
469*03f9172cSAndroid Build Coastguard Worker */
470*03f9172cSAndroid Build Coastguard Worker WPS_EV_PWD_AUTH_FAIL,
471*03f9172cSAndroid Build Coastguard Worker
472*03f9172cSAndroid Build Coastguard Worker /**
473*03f9172cSAndroid Build Coastguard Worker * WPS_EV_PBC_OVERLAP - PBC session overlap detected
474*03f9172cSAndroid Build Coastguard Worker */
475*03f9172cSAndroid Build Coastguard Worker WPS_EV_PBC_OVERLAP,
476*03f9172cSAndroid Build Coastguard Worker
477*03f9172cSAndroid Build Coastguard Worker /**
478*03f9172cSAndroid Build Coastguard Worker * WPS_EV_PBC_TIMEOUT - PBC walktime expired before protocol run start
479*03f9172cSAndroid Build Coastguard Worker */
480*03f9172cSAndroid Build Coastguard Worker WPS_EV_PBC_TIMEOUT,
481*03f9172cSAndroid Build Coastguard Worker
482*03f9172cSAndroid Build Coastguard Worker /**
483*03f9172cSAndroid Build Coastguard Worker * WPS_EV_PBC_ACTIVE - PBC mode was activated
484*03f9172cSAndroid Build Coastguard Worker */
485*03f9172cSAndroid Build Coastguard Worker WPS_EV_PBC_ACTIVE,
486*03f9172cSAndroid Build Coastguard Worker
487*03f9172cSAndroid Build Coastguard Worker /**
488*03f9172cSAndroid Build Coastguard Worker * WPS_EV_PBC_DISABLE - PBC mode was disabled
489*03f9172cSAndroid Build Coastguard Worker */
490*03f9172cSAndroid Build Coastguard Worker WPS_EV_PBC_DISABLE,
491*03f9172cSAndroid Build Coastguard Worker
492*03f9172cSAndroid Build Coastguard Worker /**
493*03f9172cSAndroid Build Coastguard Worker * WPS_EV_ER_AP_ADD - ER: AP added
494*03f9172cSAndroid Build Coastguard Worker */
495*03f9172cSAndroid Build Coastguard Worker WPS_EV_ER_AP_ADD,
496*03f9172cSAndroid Build Coastguard Worker
497*03f9172cSAndroid Build Coastguard Worker /**
498*03f9172cSAndroid Build Coastguard Worker * WPS_EV_ER_AP_REMOVE - ER: AP removed
499*03f9172cSAndroid Build Coastguard Worker */
500*03f9172cSAndroid Build Coastguard Worker WPS_EV_ER_AP_REMOVE,
501*03f9172cSAndroid Build Coastguard Worker
502*03f9172cSAndroid Build Coastguard Worker /**
503*03f9172cSAndroid Build Coastguard Worker * WPS_EV_ER_ENROLLEE_ADD - ER: Enrollee added
504*03f9172cSAndroid Build Coastguard Worker */
505*03f9172cSAndroid Build Coastguard Worker WPS_EV_ER_ENROLLEE_ADD,
506*03f9172cSAndroid Build Coastguard Worker
507*03f9172cSAndroid Build Coastguard Worker /**
508*03f9172cSAndroid Build Coastguard Worker * WPS_EV_ER_ENROLLEE_REMOVE - ER: Enrollee removed
509*03f9172cSAndroid Build Coastguard Worker */
510*03f9172cSAndroid Build Coastguard Worker WPS_EV_ER_ENROLLEE_REMOVE,
511*03f9172cSAndroid Build Coastguard Worker
512*03f9172cSAndroid Build Coastguard Worker /**
513*03f9172cSAndroid Build Coastguard Worker * WPS_EV_ER_AP_SETTINGS - ER: AP Settings learned
514*03f9172cSAndroid Build Coastguard Worker */
515*03f9172cSAndroid Build Coastguard Worker WPS_EV_ER_AP_SETTINGS,
516*03f9172cSAndroid Build Coastguard Worker
517*03f9172cSAndroid Build Coastguard Worker /**
518*03f9172cSAndroid Build Coastguard Worker * WPS_EV_ER_SET_SELECTED_REGISTRAR - ER: SetSelectedRegistrar event
519*03f9172cSAndroid Build Coastguard Worker */
520*03f9172cSAndroid Build Coastguard Worker WPS_EV_ER_SET_SELECTED_REGISTRAR,
521*03f9172cSAndroid Build Coastguard Worker
522*03f9172cSAndroid Build Coastguard Worker /**
523*03f9172cSAndroid Build Coastguard Worker * WPS_EV_AP_PIN_SUCCESS - External Registrar used correct AP PIN
524*03f9172cSAndroid Build Coastguard Worker */
525*03f9172cSAndroid Build Coastguard Worker WPS_EV_AP_PIN_SUCCESS
526*03f9172cSAndroid Build Coastguard Worker };
527*03f9172cSAndroid Build Coastguard Worker
528*03f9172cSAndroid Build Coastguard Worker /**
529*03f9172cSAndroid Build Coastguard Worker * union wps_event_data - WPS event data
530*03f9172cSAndroid Build Coastguard Worker */
531*03f9172cSAndroid Build Coastguard Worker union wps_event_data {
532*03f9172cSAndroid Build Coastguard Worker /**
533*03f9172cSAndroid Build Coastguard Worker * struct wps_event_m2d - M2D event data
534*03f9172cSAndroid Build Coastguard Worker */
535*03f9172cSAndroid Build Coastguard Worker struct wps_event_m2d {
536*03f9172cSAndroid Build Coastguard Worker u16 config_methods;
537*03f9172cSAndroid Build Coastguard Worker const u8 *manufacturer;
538*03f9172cSAndroid Build Coastguard Worker size_t manufacturer_len;
539*03f9172cSAndroid Build Coastguard Worker const u8 *model_name;
540*03f9172cSAndroid Build Coastguard Worker size_t model_name_len;
541*03f9172cSAndroid Build Coastguard Worker const u8 *model_number;
542*03f9172cSAndroid Build Coastguard Worker size_t model_number_len;
543*03f9172cSAndroid Build Coastguard Worker const u8 *serial_number;
544*03f9172cSAndroid Build Coastguard Worker size_t serial_number_len;
545*03f9172cSAndroid Build Coastguard Worker const u8 *dev_name;
546*03f9172cSAndroid Build Coastguard Worker size_t dev_name_len;
547*03f9172cSAndroid Build Coastguard Worker const u8 *primary_dev_type; /* 8 octets */
548*03f9172cSAndroid Build Coastguard Worker u16 config_error;
549*03f9172cSAndroid Build Coastguard Worker u16 dev_password_id;
550*03f9172cSAndroid Build Coastguard Worker } m2d;
551*03f9172cSAndroid Build Coastguard Worker
552*03f9172cSAndroid Build Coastguard Worker /**
553*03f9172cSAndroid Build Coastguard Worker * struct wps_event_fail - Registration failure information
554*03f9172cSAndroid Build Coastguard Worker * @msg: enum wps_msg_type
555*03f9172cSAndroid Build Coastguard Worker */
556*03f9172cSAndroid Build Coastguard Worker struct wps_event_fail {
557*03f9172cSAndroid Build Coastguard Worker int msg;
558*03f9172cSAndroid Build Coastguard Worker u16 config_error;
559*03f9172cSAndroid Build Coastguard Worker u16 error_indication;
560*03f9172cSAndroid Build Coastguard Worker u8 peer_macaddr[ETH_ALEN];
561*03f9172cSAndroid Build Coastguard Worker } fail;
562*03f9172cSAndroid Build Coastguard Worker
563*03f9172cSAndroid Build Coastguard Worker struct wps_event_success {
564*03f9172cSAndroid Build Coastguard Worker u8 peer_macaddr[ETH_ALEN];
565*03f9172cSAndroid Build Coastguard Worker } success;
566*03f9172cSAndroid Build Coastguard Worker
567*03f9172cSAndroid Build Coastguard Worker struct wps_event_pwd_auth_fail {
568*03f9172cSAndroid Build Coastguard Worker int enrollee;
569*03f9172cSAndroid Build Coastguard Worker int part;
570*03f9172cSAndroid Build Coastguard Worker u8 peer_macaddr[ETH_ALEN];
571*03f9172cSAndroid Build Coastguard Worker } pwd_auth_fail;
572*03f9172cSAndroid Build Coastguard Worker
573*03f9172cSAndroid Build Coastguard Worker struct wps_event_er_ap {
574*03f9172cSAndroid Build Coastguard Worker const u8 *uuid;
575*03f9172cSAndroid Build Coastguard Worker const u8 *mac_addr;
576*03f9172cSAndroid Build Coastguard Worker const char *friendly_name;
577*03f9172cSAndroid Build Coastguard Worker const char *manufacturer;
578*03f9172cSAndroid Build Coastguard Worker const char *manufacturer_url;
579*03f9172cSAndroid Build Coastguard Worker const char *model_description;
580*03f9172cSAndroid Build Coastguard Worker const char *model_name;
581*03f9172cSAndroid Build Coastguard Worker const char *model_number;
582*03f9172cSAndroid Build Coastguard Worker const char *model_url;
583*03f9172cSAndroid Build Coastguard Worker const char *serial_number;
584*03f9172cSAndroid Build Coastguard Worker const char *upc;
585*03f9172cSAndroid Build Coastguard Worker const u8 *pri_dev_type;
586*03f9172cSAndroid Build Coastguard Worker u8 wps_state;
587*03f9172cSAndroid Build Coastguard Worker } ap;
588*03f9172cSAndroid Build Coastguard Worker
589*03f9172cSAndroid Build Coastguard Worker struct wps_event_er_enrollee {
590*03f9172cSAndroid Build Coastguard Worker const u8 *uuid;
591*03f9172cSAndroid Build Coastguard Worker const u8 *mac_addr;
592*03f9172cSAndroid Build Coastguard Worker int m1_received;
593*03f9172cSAndroid Build Coastguard Worker u16 config_methods;
594*03f9172cSAndroid Build Coastguard Worker u16 dev_passwd_id;
595*03f9172cSAndroid Build Coastguard Worker const u8 *pri_dev_type;
596*03f9172cSAndroid Build Coastguard Worker const char *dev_name;
597*03f9172cSAndroid Build Coastguard Worker const char *manufacturer;
598*03f9172cSAndroid Build Coastguard Worker const char *model_name;
599*03f9172cSAndroid Build Coastguard Worker const char *model_number;
600*03f9172cSAndroid Build Coastguard Worker const char *serial_number;
601*03f9172cSAndroid Build Coastguard Worker } enrollee;
602*03f9172cSAndroid Build Coastguard Worker
603*03f9172cSAndroid Build Coastguard Worker struct wps_event_er_ap_settings {
604*03f9172cSAndroid Build Coastguard Worker const u8 *uuid;
605*03f9172cSAndroid Build Coastguard Worker const struct wps_credential *cred;
606*03f9172cSAndroid Build Coastguard Worker } ap_settings;
607*03f9172cSAndroid Build Coastguard Worker
608*03f9172cSAndroid Build Coastguard Worker struct wps_event_er_set_selected_registrar {
609*03f9172cSAndroid Build Coastguard Worker const u8 *uuid;
610*03f9172cSAndroid Build Coastguard Worker int sel_reg;
611*03f9172cSAndroid Build Coastguard Worker u16 dev_passwd_id;
612*03f9172cSAndroid Build Coastguard Worker u16 sel_reg_config_methods;
613*03f9172cSAndroid Build Coastguard Worker enum {
614*03f9172cSAndroid Build Coastguard Worker WPS_ER_SET_SEL_REG_START,
615*03f9172cSAndroid Build Coastguard Worker WPS_ER_SET_SEL_REG_DONE,
616*03f9172cSAndroid Build Coastguard Worker WPS_ER_SET_SEL_REG_FAILED
617*03f9172cSAndroid Build Coastguard Worker } state;
618*03f9172cSAndroid Build Coastguard Worker } set_sel_reg;
619*03f9172cSAndroid Build Coastguard Worker };
620*03f9172cSAndroid Build Coastguard Worker
621*03f9172cSAndroid Build Coastguard Worker /**
622*03f9172cSAndroid Build Coastguard Worker * struct upnp_pending_message - Pending PutWLANResponse messages
623*03f9172cSAndroid Build Coastguard Worker * @next: Pointer to next pending message or %NULL
624*03f9172cSAndroid Build Coastguard Worker * @addr: NewWLANEventMAC
625*03f9172cSAndroid Build Coastguard Worker * @msg: NewMessage
626*03f9172cSAndroid Build Coastguard Worker * @type: Message Type
627*03f9172cSAndroid Build Coastguard Worker */
628*03f9172cSAndroid Build Coastguard Worker struct upnp_pending_message {
629*03f9172cSAndroid Build Coastguard Worker struct upnp_pending_message *next;
630*03f9172cSAndroid Build Coastguard Worker u8 addr[ETH_ALEN];
631*03f9172cSAndroid Build Coastguard Worker struct wpabuf *msg;
632*03f9172cSAndroid Build Coastguard Worker enum wps_msg_type type;
633*03f9172cSAndroid Build Coastguard Worker };
634*03f9172cSAndroid Build Coastguard Worker
635*03f9172cSAndroid Build Coastguard Worker /**
636*03f9172cSAndroid Build Coastguard Worker * struct wps_context - Long term WPS context data
637*03f9172cSAndroid Build Coastguard Worker *
638*03f9172cSAndroid Build Coastguard Worker * This data is stored at the higher layer Authenticator or Supplicant data
639*03f9172cSAndroid Build Coastguard Worker * structures and it is maintained over multiple registration protocol runs.
640*03f9172cSAndroid Build Coastguard Worker */
641*03f9172cSAndroid Build Coastguard Worker struct wps_context {
642*03f9172cSAndroid Build Coastguard Worker /**
643*03f9172cSAndroid Build Coastguard Worker * ap - Whether the local end is an access point
644*03f9172cSAndroid Build Coastguard Worker */
645*03f9172cSAndroid Build Coastguard Worker int ap;
646*03f9172cSAndroid Build Coastguard Worker
647*03f9172cSAndroid Build Coastguard Worker /**
648*03f9172cSAndroid Build Coastguard Worker * registrar - Pointer to WPS registrar data from wps_registrar_init()
649*03f9172cSAndroid Build Coastguard Worker */
650*03f9172cSAndroid Build Coastguard Worker struct wps_registrar *registrar;
651*03f9172cSAndroid Build Coastguard Worker
652*03f9172cSAndroid Build Coastguard Worker /**
653*03f9172cSAndroid Build Coastguard Worker * wps_state - Current WPS state
654*03f9172cSAndroid Build Coastguard Worker */
655*03f9172cSAndroid Build Coastguard Worker enum wps_state wps_state;
656*03f9172cSAndroid Build Coastguard Worker
657*03f9172cSAndroid Build Coastguard Worker /**
658*03f9172cSAndroid Build Coastguard Worker * ap_setup_locked - Whether AP setup is locked (only used at AP)
659*03f9172cSAndroid Build Coastguard Worker */
660*03f9172cSAndroid Build Coastguard Worker int ap_setup_locked;
661*03f9172cSAndroid Build Coastguard Worker
662*03f9172cSAndroid Build Coastguard Worker /**
663*03f9172cSAndroid Build Coastguard Worker * uuid - Own UUID
664*03f9172cSAndroid Build Coastguard Worker */
665*03f9172cSAndroid Build Coastguard Worker u8 uuid[16];
666*03f9172cSAndroid Build Coastguard Worker
667*03f9172cSAndroid Build Coastguard Worker /**
668*03f9172cSAndroid Build Coastguard Worker * ssid - SSID
669*03f9172cSAndroid Build Coastguard Worker *
670*03f9172cSAndroid Build Coastguard Worker * This SSID is used by the Registrar to fill in information for
671*03f9172cSAndroid Build Coastguard Worker * Credentials. In addition, AP uses it when acting as an Enrollee to
672*03f9172cSAndroid Build Coastguard Worker * notify Registrar of the current configuration.
673*03f9172cSAndroid Build Coastguard Worker */
674*03f9172cSAndroid Build Coastguard Worker u8 ssid[SSID_MAX_LEN];
675*03f9172cSAndroid Build Coastguard Worker
676*03f9172cSAndroid Build Coastguard Worker /**
677*03f9172cSAndroid Build Coastguard Worker * ssid_len - Length of ssid in octets
678*03f9172cSAndroid Build Coastguard Worker */
679*03f9172cSAndroid Build Coastguard Worker size_t ssid_len;
680*03f9172cSAndroid Build Coastguard Worker
681*03f9172cSAndroid Build Coastguard Worker /**
682*03f9172cSAndroid Build Coastguard Worker * dev - Own WPS device data
683*03f9172cSAndroid Build Coastguard Worker */
684*03f9172cSAndroid Build Coastguard Worker struct wps_device_data dev;
685*03f9172cSAndroid Build Coastguard Worker
686*03f9172cSAndroid Build Coastguard Worker /**
687*03f9172cSAndroid Build Coastguard Worker * dh_ctx - Context data for Diffie-Hellman operation
688*03f9172cSAndroid Build Coastguard Worker */
689*03f9172cSAndroid Build Coastguard Worker void *dh_ctx;
690*03f9172cSAndroid Build Coastguard Worker
691*03f9172cSAndroid Build Coastguard Worker /**
692*03f9172cSAndroid Build Coastguard Worker * dh_privkey - Diffie-Hellman private key
693*03f9172cSAndroid Build Coastguard Worker */
694*03f9172cSAndroid Build Coastguard Worker struct wpabuf *dh_privkey;
695*03f9172cSAndroid Build Coastguard Worker
696*03f9172cSAndroid Build Coastguard Worker /**
697*03f9172cSAndroid Build Coastguard Worker * dh_pubkey_oob - Diffie-Hellman public key
698*03f9172cSAndroid Build Coastguard Worker */
699*03f9172cSAndroid Build Coastguard Worker struct wpabuf *dh_pubkey;
700*03f9172cSAndroid Build Coastguard Worker
701*03f9172cSAndroid Build Coastguard Worker /**
702*03f9172cSAndroid Build Coastguard Worker * config_methods - Enabled configuration methods
703*03f9172cSAndroid Build Coastguard Worker *
704*03f9172cSAndroid Build Coastguard Worker * Bit field of WPS_CONFIG_*
705*03f9172cSAndroid Build Coastguard Worker */
706*03f9172cSAndroid Build Coastguard Worker u16 config_methods;
707*03f9172cSAndroid Build Coastguard Worker
708*03f9172cSAndroid Build Coastguard Worker /**
709*03f9172cSAndroid Build Coastguard Worker * encr_types - Enabled encryption types (bit field of WPS_ENCR_*)
710*03f9172cSAndroid Build Coastguard Worker */
711*03f9172cSAndroid Build Coastguard Worker u16 encr_types;
712*03f9172cSAndroid Build Coastguard Worker
713*03f9172cSAndroid Build Coastguard Worker /**
714*03f9172cSAndroid Build Coastguard Worker * encr_types_rsn - Enabled encryption types for RSN (WPS_ENCR_*)
715*03f9172cSAndroid Build Coastguard Worker */
716*03f9172cSAndroid Build Coastguard Worker u16 encr_types_rsn;
717*03f9172cSAndroid Build Coastguard Worker
718*03f9172cSAndroid Build Coastguard Worker /**
719*03f9172cSAndroid Build Coastguard Worker * encr_types_wpa - Enabled encryption types for WPA (WPS_ENCR_*)
720*03f9172cSAndroid Build Coastguard Worker */
721*03f9172cSAndroid Build Coastguard Worker u16 encr_types_wpa;
722*03f9172cSAndroid Build Coastguard Worker
723*03f9172cSAndroid Build Coastguard Worker /**
724*03f9172cSAndroid Build Coastguard Worker * auth_types - Authentication types (bit field of WPS_AUTH_*)
725*03f9172cSAndroid Build Coastguard Worker */
726*03f9172cSAndroid Build Coastguard Worker u16 auth_types;
727*03f9172cSAndroid Build Coastguard Worker
728*03f9172cSAndroid Build Coastguard Worker /**
729*03f9172cSAndroid Build Coastguard Worker * encr_types - Current AP encryption type (WPS_ENCR_*)
730*03f9172cSAndroid Build Coastguard Worker */
731*03f9172cSAndroid Build Coastguard Worker u16 ap_encr_type;
732*03f9172cSAndroid Build Coastguard Worker
733*03f9172cSAndroid Build Coastguard Worker /**
734*03f9172cSAndroid Build Coastguard Worker * ap_auth_type - Current AP authentication types (WPS_AUTH_*)
735*03f9172cSAndroid Build Coastguard Worker */
736*03f9172cSAndroid Build Coastguard Worker u16 ap_auth_type;
737*03f9172cSAndroid Build Coastguard Worker
738*03f9172cSAndroid Build Coastguard Worker /**
739*03f9172cSAndroid Build Coastguard Worker * network_key - The current Network Key (PSK) or %NULL to generate new
740*03f9172cSAndroid Build Coastguard Worker *
741*03f9172cSAndroid Build Coastguard Worker * If %NULL, Registrar will generate per-device PSK. In addition, AP
742*03f9172cSAndroid Build Coastguard Worker * uses this when acting as an Enrollee to notify Registrar of the
743*03f9172cSAndroid Build Coastguard Worker * current configuration.
744*03f9172cSAndroid Build Coastguard Worker *
745*03f9172cSAndroid Build Coastguard Worker * When using WPA/WPA2-Personal, this key can be either the ASCII
746*03f9172cSAndroid Build Coastguard Worker * passphrase (8..63 characters) or the 32-octet PSK (64 hex
747*03f9172cSAndroid Build Coastguard Worker * characters). When this is set to the ASCII passphrase, the PSK can
748*03f9172cSAndroid Build Coastguard Worker * be provided in the psk buffer and used per-Enrollee to control which
749*03f9172cSAndroid Build Coastguard Worker * key type is included in the Credential (e.g., to reduce calculation
750*03f9172cSAndroid Build Coastguard Worker * need on low-powered devices by provisioning PSK while still allowing
751*03f9172cSAndroid Build Coastguard Worker * other devices to get the passphrase).
752*03f9172cSAndroid Build Coastguard Worker */
753*03f9172cSAndroid Build Coastguard Worker u8 *network_key;
754*03f9172cSAndroid Build Coastguard Worker
755*03f9172cSAndroid Build Coastguard Worker /**
756*03f9172cSAndroid Build Coastguard Worker * network_key_len - Length of network_key in octets
757*03f9172cSAndroid Build Coastguard Worker */
758*03f9172cSAndroid Build Coastguard Worker size_t network_key_len;
759*03f9172cSAndroid Build Coastguard Worker
760*03f9172cSAndroid Build Coastguard Worker /**
761*03f9172cSAndroid Build Coastguard Worker * psk - The current network PSK
762*03f9172cSAndroid Build Coastguard Worker *
763*03f9172cSAndroid Build Coastguard Worker * This optional value can be used to provide the current PSK if
764*03f9172cSAndroid Build Coastguard Worker * network_key is set to the ASCII passphrase.
765*03f9172cSAndroid Build Coastguard Worker */
766*03f9172cSAndroid Build Coastguard Worker u8 psk[32];
767*03f9172cSAndroid Build Coastguard Worker
768*03f9172cSAndroid Build Coastguard Worker /**
769*03f9172cSAndroid Build Coastguard Worker * psk_set - Whether psk value is set
770*03f9172cSAndroid Build Coastguard Worker */
771*03f9172cSAndroid Build Coastguard Worker int psk_set;
772*03f9172cSAndroid Build Coastguard Worker
773*03f9172cSAndroid Build Coastguard Worker /**
774*03f9172cSAndroid Build Coastguard Worker * ap_settings - AP Settings override for M7 (only used at AP)
775*03f9172cSAndroid Build Coastguard Worker *
776*03f9172cSAndroid Build Coastguard Worker * If %NULL, AP Settings attributes will be generated based on the
777*03f9172cSAndroid Build Coastguard Worker * current network configuration.
778*03f9172cSAndroid Build Coastguard Worker */
779*03f9172cSAndroid Build Coastguard Worker u8 *ap_settings;
780*03f9172cSAndroid Build Coastguard Worker
781*03f9172cSAndroid Build Coastguard Worker /**
782*03f9172cSAndroid Build Coastguard Worker * ap_settings_len - Length of ap_settings in octets
783*03f9172cSAndroid Build Coastguard Worker */
784*03f9172cSAndroid Build Coastguard Worker size_t ap_settings_len;
785*03f9172cSAndroid Build Coastguard Worker
786*03f9172cSAndroid Build Coastguard Worker /**
787*03f9172cSAndroid Build Coastguard Worker * friendly_name - Friendly Name (required for UPnP)
788*03f9172cSAndroid Build Coastguard Worker */
789*03f9172cSAndroid Build Coastguard Worker char *friendly_name;
790*03f9172cSAndroid Build Coastguard Worker
791*03f9172cSAndroid Build Coastguard Worker /**
792*03f9172cSAndroid Build Coastguard Worker * manufacturer_url - Manufacturer URL (optional for UPnP)
793*03f9172cSAndroid Build Coastguard Worker */
794*03f9172cSAndroid Build Coastguard Worker char *manufacturer_url;
795*03f9172cSAndroid Build Coastguard Worker
796*03f9172cSAndroid Build Coastguard Worker /**
797*03f9172cSAndroid Build Coastguard Worker * model_description - Model Description (recommended for UPnP)
798*03f9172cSAndroid Build Coastguard Worker */
799*03f9172cSAndroid Build Coastguard Worker char *model_description;
800*03f9172cSAndroid Build Coastguard Worker
801*03f9172cSAndroid Build Coastguard Worker /**
802*03f9172cSAndroid Build Coastguard Worker * model_url - Model URL (optional for UPnP)
803*03f9172cSAndroid Build Coastguard Worker */
804*03f9172cSAndroid Build Coastguard Worker char *model_url;
805*03f9172cSAndroid Build Coastguard Worker
806*03f9172cSAndroid Build Coastguard Worker /**
807*03f9172cSAndroid Build Coastguard Worker * upc - Universal Product Code (optional for UPnP)
808*03f9172cSAndroid Build Coastguard Worker */
809*03f9172cSAndroid Build Coastguard Worker char *upc;
810*03f9172cSAndroid Build Coastguard Worker
811*03f9172cSAndroid Build Coastguard Worker /**
812*03f9172cSAndroid Build Coastguard Worker * cred_cb - Callback to notify that new Credentials were received
813*03f9172cSAndroid Build Coastguard Worker * @ctx: Higher layer context data (cb_ctx)
814*03f9172cSAndroid Build Coastguard Worker * @cred: The received Credential
815*03f9172cSAndroid Build Coastguard Worker * Return: 0 on success, -1 on failure
816*03f9172cSAndroid Build Coastguard Worker */
817*03f9172cSAndroid Build Coastguard Worker int (*cred_cb)(void *ctx, const struct wps_credential *cred);
818*03f9172cSAndroid Build Coastguard Worker
819*03f9172cSAndroid Build Coastguard Worker /**
820*03f9172cSAndroid Build Coastguard Worker * event_cb - Event callback (state information about progress)
821*03f9172cSAndroid Build Coastguard Worker * @ctx: Higher layer context data (cb_ctx)
822*03f9172cSAndroid Build Coastguard Worker * @event: Event type
823*03f9172cSAndroid Build Coastguard Worker * @data: Event data
824*03f9172cSAndroid Build Coastguard Worker */
825*03f9172cSAndroid Build Coastguard Worker void (*event_cb)(void *ctx, enum wps_event event,
826*03f9172cSAndroid Build Coastguard Worker union wps_event_data *data);
827*03f9172cSAndroid Build Coastguard Worker
828*03f9172cSAndroid Build Coastguard Worker /**
829*03f9172cSAndroid Build Coastguard Worker * rf_band_cb - Fetch currently used RF band
830*03f9172cSAndroid Build Coastguard Worker * @ctx: Higher layer context data (cb_ctx)
831*03f9172cSAndroid Build Coastguard Worker * Return: Current used RF band or 0 if not known
832*03f9172cSAndroid Build Coastguard Worker */
833*03f9172cSAndroid Build Coastguard Worker int (*rf_band_cb)(void *ctx);
834*03f9172cSAndroid Build Coastguard Worker
835*03f9172cSAndroid Build Coastguard Worker /**
836*03f9172cSAndroid Build Coastguard Worker * cb_ctx: Higher layer context data for callbacks
837*03f9172cSAndroid Build Coastguard Worker */
838*03f9172cSAndroid Build Coastguard Worker void *cb_ctx;
839*03f9172cSAndroid Build Coastguard Worker
840*03f9172cSAndroid Build Coastguard Worker struct upnp_wps_device_sm *wps_upnp;
841*03f9172cSAndroid Build Coastguard Worker
842*03f9172cSAndroid Build Coastguard Worker /* Pending messages from UPnP PutWLANResponse */
843*03f9172cSAndroid Build Coastguard Worker struct upnp_pending_message *upnp_msgs;
844*03f9172cSAndroid Build Coastguard Worker
845*03f9172cSAndroid Build Coastguard Worker u16 ap_nfc_dev_pw_id;
846*03f9172cSAndroid Build Coastguard Worker struct wpabuf *ap_nfc_dh_pubkey;
847*03f9172cSAndroid Build Coastguard Worker struct wpabuf *ap_nfc_dh_privkey;
848*03f9172cSAndroid Build Coastguard Worker struct wpabuf *ap_nfc_dev_pw;
849*03f9172cSAndroid Build Coastguard Worker
850*03f9172cSAndroid Build Coastguard Worker /* Whether to send WPA2-PSK passphrase as a passphrase instead of PSK
851*03f9172cSAndroid Build Coastguard Worker * for WPA3-Personal transition mode needs. */
852*03f9172cSAndroid Build Coastguard Worker bool use_passphrase;
853*03f9172cSAndroid Build Coastguard Worker };
854*03f9172cSAndroid Build Coastguard Worker
855*03f9172cSAndroid Build Coastguard Worker struct wps_registrar *
856*03f9172cSAndroid Build Coastguard Worker wps_registrar_init(struct wps_context *wps,
857*03f9172cSAndroid Build Coastguard Worker const struct wps_registrar_config *cfg);
858*03f9172cSAndroid Build Coastguard Worker void wps_registrar_deinit(struct wps_registrar *reg);
859*03f9172cSAndroid Build Coastguard Worker int wps_registrar_add_pin(struct wps_registrar *reg, const u8 *addr,
860*03f9172cSAndroid Build Coastguard Worker const u8 *uuid, const u8 *pin, size_t pin_len,
861*03f9172cSAndroid Build Coastguard Worker int timeout);
862*03f9172cSAndroid Build Coastguard Worker int wps_registrar_invalidate_pin(struct wps_registrar *reg, const u8 *uuid);
863*03f9172cSAndroid Build Coastguard Worker int wps_registrar_wps_cancel(struct wps_registrar *reg);
864*03f9172cSAndroid Build Coastguard Worker int wps_registrar_unlock_pin(struct wps_registrar *reg, const u8 *uuid);
865*03f9172cSAndroid Build Coastguard Worker int wps_registrar_button_pushed(struct wps_registrar *reg,
866*03f9172cSAndroid Build Coastguard Worker const u8 *p2p_dev_addr);
867*03f9172cSAndroid Build Coastguard Worker void wps_registrar_complete(struct wps_registrar *registrar, const u8 *uuid_e,
868*03f9172cSAndroid Build Coastguard Worker const u8 *dev_pw, size_t dev_pw_len);
869*03f9172cSAndroid Build Coastguard Worker void wps_registrar_probe_req_rx(struct wps_registrar *reg, const u8 *addr,
870*03f9172cSAndroid Build Coastguard Worker const struct wpabuf *wps_data,
871*03f9172cSAndroid Build Coastguard Worker int p2p_wildcard);
872*03f9172cSAndroid Build Coastguard Worker int wps_registrar_update_ie(struct wps_registrar *reg);
873*03f9172cSAndroid Build Coastguard Worker int wps_registrar_get_info(struct wps_registrar *reg, const u8 *addr,
874*03f9172cSAndroid Build Coastguard Worker char *buf, size_t buflen);
875*03f9172cSAndroid Build Coastguard Worker int wps_registrar_config_ap(struct wps_registrar *reg,
876*03f9172cSAndroid Build Coastguard Worker struct wps_credential *cred);
877*03f9172cSAndroid Build Coastguard Worker int wps_registrar_add_nfc_pw_token(struct wps_registrar *reg,
878*03f9172cSAndroid Build Coastguard Worker const u8 *pubkey_hash, u16 pw_id,
879*03f9172cSAndroid Build Coastguard Worker const u8 *dev_pw, size_t dev_pw_len,
880*03f9172cSAndroid Build Coastguard Worker int pk_hash_provided_oob);
881*03f9172cSAndroid Build Coastguard Worker int wps_registrar_add_nfc_password_token(struct wps_registrar *reg,
882*03f9172cSAndroid Build Coastguard Worker const u8 *oob_dev_pw,
883*03f9172cSAndroid Build Coastguard Worker size_t oob_dev_pw_len);
884*03f9172cSAndroid Build Coastguard Worker void wps_registrar_flush(struct wps_registrar *reg);
885*03f9172cSAndroid Build Coastguard Worker int wps_registrar_update_multi_ap(struct wps_registrar *reg,
886*03f9172cSAndroid Build Coastguard Worker const u8 *multi_ap_backhaul_ssid,
887*03f9172cSAndroid Build Coastguard Worker size_t multi_ap_backhaul_ssid_len,
888*03f9172cSAndroid Build Coastguard Worker const u8 *multi_ap_backhaul_network_key,
889*03f9172cSAndroid Build Coastguard Worker size_t multi_ap_backhaul_network_key_len);
890*03f9172cSAndroid Build Coastguard Worker
891*03f9172cSAndroid Build Coastguard Worker int wps_build_credential_wrap(struct wpabuf *msg,
892*03f9172cSAndroid Build Coastguard Worker const struct wps_credential *cred);
893*03f9172cSAndroid Build Coastguard Worker
894*03f9172cSAndroid Build Coastguard Worker unsigned int wps_pin_checksum(unsigned int pin);
895*03f9172cSAndroid Build Coastguard Worker unsigned int wps_pin_valid(unsigned int pin);
896*03f9172cSAndroid Build Coastguard Worker int wps_generate_pin(unsigned int *pin);
897*03f9172cSAndroid Build Coastguard Worker int wps_pin_str_valid(const char *pin);
898*03f9172cSAndroid Build Coastguard Worker void wps_free_pending_msgs(struct upnp_pending_message *msgs);
899*03f9172cSAndroid Build Coastguard Worker
900*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wps_get_oob_cred(struct wps_context *wps, int rf_band,
901*03f9172cSAndroid Build Coastguard Worker int channel);
902*03f9172cSAndroid Build Coastguard Worker int wps_oob_use_cred(struct wps_context *wps, struct wps_parse_attr *attr);
903*03f9172cSAndroid Build Coastguard Worker int wps_attr_text(struct wpabuf *data, char *buf, char *end);
904*03f9172cSAndroid Build Coastguard Worker const char * wps_ei_str(enum wps_error_indication ei);
905*03f9172cSAndroid Build Coastguard Worker
906*03f9172cSAndroid Build Coastguard Worker struct wps_er * wps_er_init(struct wps_context *wps, const char *ifname,
907*03f9172cSAndroid Build Coastguard Worker const char *filter);
908*03f9172cSAndroid Build Coastguard Worker void wps_er_refresh(struct wps_er *er);
909*03f9172cSAndroid Build Coastguard Worker void wps_er_deinit(struct wps_er *er, void (*cb)(void *ctx), void *ctx);
910*03f9172cSAndroid Build Coastguard Worker void wps_er_set_sel_reg(struct wps_er *er, int sel_reg, u16 dev_passwd_id,
911*03f9172cSAndroid Build Coastguard Worker u16 sel_reg_config_methods);
912*03f9172cSAndroid Build Coastguard Worker int wps_er_pbc(struct wps_er *er, const u8 *uuid, const u8 *addr);
913*03f9172cSAndroid Build Coastguard Worker const u8 * wps_er_get_sta_uuid(struct wps_er *er, const u8 *addr);
914*03f9172cSAndroid Build Coastguard Worker int wps_er_learn(struct wps_er *er, const u8 *uuid, const u8 *addr,
915*03f9172cSAndroid Build Coastguard Worker const u8 *pin, size_t pin_len);
916*03f9172cSAndroid Build Coastguard Worker int wps_er_set_config(struct wps_er *er, const u8 *uuid, const u8 *addr,
917*03f9172cSAndroid Build Coastguard Worker const struct wps_credential *cred);
918*03f9172cSAndroid Build Coastguard Worker int wps_er_config(struct wps_er *er, const u8 *uuid, const u8 *addr,
919*03f9172cSAndroid Build Coastguard Worker const u8 *pin, size_t pin_len,
920*03f9172cSAndroid Build Coastguard Worker const struct wps_credential *cred);
921*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wps_er_config_token_from_cred(struct wps_context *wps,
922*03f9172cSAndroid Build Coastguard Worker struct wps_credential *cred);
923*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wps_er_nfc_config_token(struct wps_er *er, const u8 *uuid,
924*03f9172cSAndroid Build Coastguard Worker const u8 *addr);
925*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wps_er_nfc_handover_sel(struct wps_er *er,
926*03f9172cSAndroid Build Coastguard Worker struct wps_context *wps, const u8 *uuid,
927*03f9172cSAndroid Build Coastguard Worker const u8 *addr, struct wpabuf *pubkey);
928*03f9172cSAndroid Build Coastguard Worker
929*03f9172cSAndroid Build Coastguard Worker int wps_dev_type_str2bin(const char *str, u8 dev_type[WPS_DEV_TYPE_LEN]);
930*03f9172cSAndroid Build Coastguard Worker char * wps_dev_type_bin2str(const u8 dev_type[WPS_DEV_TYPE_LEN], char *buf,
931*03f9172cSAndroid Build Coastguard Worker size_t buf_len);
932*03f9172cSAndroid Build Coastguard Worker void uuid_gen_mac_addr(const u8 *mac_addr, u8 *uuid);
933*03f9172cSAndroid Build Coastguard Worker u16 wps_config_methods_str2bin(const char *str);
934*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wps_build_nfc_pw_token(u16 dev_pw_id,
935*03f9172cSAndroid Build Coastguard Worker const struct wpabuf *pubkey,
936*03f9172cSAndroid Build Coastguard Worker const struct wpabuf *dev_pw);
937*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wps_nfc_token_build(int ndef, int id, struct wpabuf *pubkey,
938*03f9172cSAndroid Build Coastguard Worker struct wpabuf *dev_pw);
939*03f9172cSAndroid Build Coastguard Worker int wps_nfc_gen_dh(struct wpabuf **pubkey, struct wpabuf **privkey);
940*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wps_nfc_token_gen(int ndef, int *id, struct wpabuf **pubkey,
941*03f9172cSAndroid Build Coastguard Worker struct wpabuf **privkey,
942*03f9172cSAndroid Build Coastguard Worker struct wpabuf **dev_pw);
943*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wps_build_nfc_handover_req(struct wps_context *ctx,
944*03f9172cSAndroid Build Coastguard Worker struct wpabuf *nfc_dh_pubkey);
945*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wps_build_nfc_handover_sel(struct wps_context *ctx,
946*03f9172cSAndroid Build Coastguard Worker struct wpabuf *nfc_dh_pubkey,
947*03f9172cSAndroid Build Coastguard Worker const u8 *bssid, int freq);
948*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wps_build_nfc_handover_req_p2p(struct wps_context *ctx,
949*03f9172cSAndroid Build Coastguard Worker struct wpabuf *nfc_dh_pubkey);
950*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wps_build_nfc_handover_sel_p2p(struct wps_context *ctx,
951*03f9172cSAndroid Build Coastguard Worker int nfc_dev_pw_id,
952*03f9172cSAndroid Build Coastguard Worker struct wpabuf *nfc_dh_pubkey,
953*03f9172cSAndroid Build Coastguard Worker struct wpabuf *nfc_dev_pw);
954*03f9172cSAndroid Build Coastguard Worker
955*03f9172cSAndroid Build Coastguard Worker /* ndef.c */
956*03f9172cSAndroid Build Coastguard Worker struct wpabuf * ndef_parse_wifi(const struct wpabuf *buf);
957*03f9172cSAndroid Build Coastguard Worker struct wpabuf * ndef_build_wifi(const struct wpabuf *buf);
958*03f9172cSAndroid Build Coastguard Worker struct wpabuf * ndef_parse_p2p(const struct wpabuf *buf);
959*03f9172cSAndroid Build Coastguard Worker struct wpabuf * ndef_build_p2p(const struct wpabuf *buf);
960*03f9172cSAndroid Build Coastguard Worker
961*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_WPS_STRICT
962*03f9172cSAndroid Build Coastguard Worker int wps_validate_beacon(const struct wpabuf *wps_ie);
963*03f9172cSAndroid Build Coastguard Worker int wps_validate_beacon_probe_resp(const struct wpabuf *wps_ie, int probe,
964*03f9172cSAndroid Build Coastguard Worker const u8 *addr);
965*03f9172cSAndroid Build Coastguard Worker int wps_validate_probe_req(const struct wpabuf *wps_ie, const u8 *addr);
966*03f9172cSAndroid Build Coastguard Worker int wps_validate_assoc_req(const struct wpabuf *wps_ie);
967*03f9172cSAndroid Build Coastguard Worker int wps_validate_assoc_resp(const struct wpabuf *wps_ie);
968*03f9172cSAndroid Build Coastguard Worker int wps_validate_m1(const struct wpabuf *tlvs);
969*03f9172cSAndroid Build Coastguard Worker int wps_validate_m2(const struct wpabuf *tlvs);
970*03f9172cSAndroid Build Coastguard Worker int wps_validate_m2d(const struct wpabuf *tlvs);
971*03f9172cSAndroid Build Coastguard Worker int wps_validate_m3(const struct wpabuf *tlvs);
972*03f9172cSAndroid Build Coastguard Worker int wps_validate_m4(const struct wpabuf *tlvs);
973*03f9172cSAndroid Build Coastguard Worker int wps_validate_m4_encr(const struct wpabuf *tlvs, int wps2);
974*03f9172cSAndroid Build Coastguard Worker int wps_validate_m5(const struct wpabuf *tlvs);
975*03f9172cSAndroid Build Coastguard Worker int wps_validate_m5_encr(const struct wpabuf *tlvs, int wps2);
976*03f9172cSAndroid Build Coastguard Worker int wps_validate_m6(const struct wpabuf *tlvs);
977*03f9172cSAndroid Build Coastguard Worker int wps_validate_m6_encr(const struct wpabuf *tlvs, int wps2);
978*03f9172cSAndroid Build Coastguard Worker int wps_validate_m7(const struct wpabuf *tlvs);
979*03f9172cSAndroid Build Coastguard Worker int wps_validate_m7_encr(const struct wpabuf *tlvs, int ap, int wps2);
980*03f9172cSAndroid Build Coastguard Worker int wps_validate_m8(const struct wpabuf *tlvs);
981*03f9172cSAndroid Build Coastguard Worker int wps_validate_m8_encr(const struct wpabuf *tlvs, int ap, int wps2);
982*03f9172cSAndroid Build Coastguard Worker int wps_validate_wsc_ack(const struct wpabuf *tlvs);
983*03f9172cSAndroid Build Coastguard Worker int wps_validate_wsc_nack(const struct wpabuf *tlvs);
984*03f9172cSAndroid Build Coastguard Worker int wps_validate_wsc_done(const struct wpabuf *tlvs);
985*03f9172cSAndroid Build Coastguard Worker int wps_validate_upnp_set_selected_registrar(const struct wpabuf *tlvs);
986*03f9172cSAndroid Build Coastguard Worker #else /* CONFIG_WPS_STRICT */
wps_validate_beacon(const struct wpabuf * wps_ie)987*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_beacon(const struct wpabuf *wps_ie){
988*03f9172cSAndroid Build Coastguard Worker return 0;
989*03f9172cSAndroid Build Coastguard Worker }
990*03f9172cSAndroid Build Coastguard Worker
wps_validate_beacon_probe_resp(const struct wpabuf * wps_ie,int probe,const u8 * addr)991*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_beacon_probe_resp(const struct wpabuf *wps_ie,
992*03f9172cSAndroid Build Coastguard Worker int probe, const u8 *addr)
993*03f9172cSAndroid Build Coastguard Worker {
994*03f9172cSAndroid Build Coastguard Worker return 0;
995*03f9172cSAndroid Build Coastguard Worker }
996*03f9172cSAndroid Build Coastguard Worker
wps_validate_probe_req(const struct wpabuf * wps_ie,const u8 * addr)997*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_probe_req(const struct wpabuf *wps_ie,
998*03f9172cSAndroid Build Coastguard Worker const u8 *addr)
999*03f9172cSAndroid Build Coastguard Worker {
1000*03f9172cSAndroid Build Coastguard Worker return 0;
1001*03f9172cSAndroid Build Coastguard Worker }
1002*03f9172cSAndroid Build Coastguard Worker
wps_validate_assoc_req(const struct wpabuf * wps_ie)1003*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_assoc_req(const struct wpabuf *wps_ie)
1004*03f9172cSAndroid Build Coastguard Worker {
1005*03f9172cSAndroid Build Coastguard Worker return 0;
1006*03f9172cSAndroid Build Coastguard Worker }
1007*03f9172cSAndroid Build Coastguard Worker
wps_validate_assoc_resp(const struct wpabuf * wps_ie)1008*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_assoc_resp(const struct wpabuf *wps_ie)
1009*03f9172cSAndroid Build Coastguard Worker {
1010*03f9172cSAndroid Build Coastguard Worker return 0;
1011*03f9172cSAndroid Build Coastguard Worker }
1012*03f9172cSAndroid Build Coastguard Worker
wps_validate_m1(const struct wpabuf * tlvs)1013*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_m1(const struct wpabuf *tlvs)
1014*03f9172cSAndroid Build Coastguard Worker {
1015*03f9172cSAndroid Build Coastguard Worker return 0;
1016*03f9172cSAndroid Build Coastguard Worker }
1017*03f9172cSAndroid Build Coastguard Worker
wps_validate_m2(const struct wpabuf * tlvs)1018*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_m2(const struct wpabuf *tlvs)
1019*03f9172cSAndroid Build Coastguard Worker {
1020*03f9172cSAndroid Build Coastguard Worker return 0;
1021*03f9172cSAndroid Build Coastguard Worker }
1022*03f9172cSAndroid Build Coastguard Worker
wps_validate_m2d(const struct wpabuf * tlvs)1023*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_m2d(const struct wpabuf *tlvs)
1024*03f9172cSAndroid Build Coastguard Worker {
1025*03f9172cSAndroid Build Coastguard Worker return 0;
1026*03f9172cSAndroid Build Coastguard Worker }
1027*03f9172cSAndroid Build Coastguard Worker
wps_validate_m3(const struct wpabuf * tlvs)1028*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_m3(const struct wpabuf *tlvs)
1029*03f9172cSAndroid Build Coastguard Worker {
1030*03f9172cSAndroid Build Coastguard Worker return 0;
1031*03f9172cSAndroid Build Coastguard Worker }
1032*03f9172cSAndroid Build Coastguard Worker
wps_validate_m4(const struct wpabuf * tlvs)1033*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_m4(const struct wpabuf *tlvs)
1034*03f9172cSAndroid Build Coastguard Worker {
1035*03f9172cSAndroid Build Coastguard Worker return 0;
1036*03f9172cSAndroid Build Coastguard Worker }
1037*03f9172cSAndroid Build Coastguard Worker
wps_validate_m4_encr(const struct wpabuf * tlvs,int wps2)1038*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_m4_encr(const struct wpabuf *tlvs, int wps2)
1039*03f9172cSAndroid Build Coastguard Worker {
1040*03f9172cSAndroid Build Coastguard Worker return 0;
1041*03f9172cSAndroid Build Coastguard Worker }
1042*03f9172cSAndroid Build Coastguard Worker
wps_validate_m5(const struct wpabuf * tlvs)1043*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_m5(const struct wpabuf *tlvs)
1044*03f9172cSAndroid Build Coastguard Worker {
1045*03f9172cSAndroid Build Coastguard Worker return 0;
1046*03f9172cSAndroid Build Coastguard Worker }
1047*03f9172cSAndroid Build Coastguard Worker
wps_validate_m5_encr(const struct wpabuf * tlvs,int wps2)1048*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_m5_encr(const struct wpabuf *tlvs, int wps2)
1049*03f9172cSAndroid Build Coastguard Worker {
1050*03f9172cSAndroid Build Coastguard Worker return 0;
1051*03f9172cSAndroid Build Coastguard Worker }
1052*03f9172cSAndroid Build Coastguard Worker
wps_validate_m6(const struct wpabuf * tlvs)1053*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_m6(const struct wpabuf *tlvs)
1054*03f9172cSAndroid Build Coastguard Worker {
1055*03f9172cSAndroid Build Coastguard Worker return 0;
1056*03f9172cSAndroid Build Coastguard Worker }
1057*03f9172cSAndroid Build Coastguard Worker
wps_validate_m6_encr(const struct wpabuf * tlvs,int wps2)1058*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_m6_encr(const struct wpabuf *tlvs, int wps2)
1059*03f9172cSAndroid Build Coastguard Worker {
1060*03f9172cSAndroid Build Coastguard Worker return 0;
1061*03f9172cSAndroid Build Coastguard Worker }
1062*03f9172cSAndroid Build Coastguard Worker
wps_validate_m7(const struct wpabuf * tlvs)1063*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_m7(const struct wpabuf *tlvs)
1064*03f9172cSAndroid Build Coastguard Worker {
1065*03f9172cSAndroid Build Coastguard Worker return 0;
1066*03f9172cSAndroid Build Coastguard Worker }
1067*03f9172cSAndroid Build Coastguard Worker
wps_validate_m7_encr(const struct wpabuf * tlvs,int ap,int wps2)1068*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_m7_encr(const struct wpabuf *tlvs, int ap,
1069*03f9172cSAndroid Build Coastguard Worker int wps2)
1070*03f9172cSAndroid Build Coastguard Worker {
1071*03f9172cSAndroid Build Coastguard Worker return 0;
1072*03f9172cSAndroid Build Coastguard Worker }
1073*03f9172cSAndroid Build Coastguard Worker
wps_validate_m8(const struct wpabuf * tlvs)1074*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_m8(const struct wpabuf *tlvs)
1075*03f9172cSAndroid Build Coastguard Worker {
1076*03f9172cSAndroid Build Coastguard Worker return 0;
1077*03f9172cSAndroid Build Coastguard Worker }
1078*03f9172cSAndroid Build Coastguard Worker
wps_validate_m8_encr(const struct wpabuf * tlvs,int ap,int wps2)1079*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_m8_encr(const struct wpabuf *tlvs, int ap,
1080*03f9172cSAndroid Build Coastguard Worker int wps2)
1081*03f9172cSAndroid Build Coastguard Worker {
1082*03f9172cSAndroid Build Coastguard Worker return 0;
1083*03f9172cSAndroid Build Coastguard Worker }
1084*03f9172cSAndroid Build Coastguard Worker
wps_validate_wsc_ack(const struct wpabuf * tlvs)1085*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_wsc_ack(const struct wpabuf *tlvs)
1086*03f9172cSAndroid Build Coastguard Worker {
1087*03f9172cSAndroid Build Coastguard Worker return 0;
1088*03f9172cSAndroid Build Coastguard Worker }
1089*03f9172cSAndroid Build Coastguard Worker
wps_validate_wsc_nack(const struct wpabuf * tlvs)1090*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_wsc_nack(const struct wpabuf *tlvs)
1091*03f9172cSAndroid Build Coastguard Worker {
1092*03f9172cSAndroid Build Coastguard Worker return 0;
1093*03f9172cSAndroid Build Coastguard Worker }
1094*03f9172cSAndroid Build Coastguard Worker
wps_validate_wsc_done(const struct wpabuf * tlvs)1095*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_wsc_done(const struct wpabuf *tlvs)
1096*03f9172cSAndroid Build Coastguard Worker {
1097*03f9172cSAndroid Build Coastguard Worker return 0;
1098*03f9172cSAndroid Build Coastguard Worker }
1099*03f9172cSAndroid Build Coastguard Worker
wps_validate_upnp_set_selected_registrar(const struct wpabuf * tlvs)1100*03f9172cSAndroid Build Coastguard Worker static inline int wps_validate_upnp_set_selected_registrar(
1101*03f9172cSAndroid Build Coastguard Worker const struct wpabuf *tlvs)
1102*03f9172cSAndroid Build Coastguard Worker {
1103*03f9172cSAndroid Build Coastguard Worker return 0;
1104*03f9172cSAndroid Build Coastguard Worker }
1105*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_WPS_STRICT */
1106*03f9172cSAndroid Build Coastguard Worker
1107*03f9172cSAndroid Build Coastguard Worker #endif /* WPS_H */
1108