xref: /freebsd/contrib/wpa/src/wps/wps_i.h (revision a90b9d0159070121c221b966469c3e36d912bf82)
139beb93cSSam Leffler /*
239beb93cSSam Leffler  * Wi-Fi Protected Setup - internal definitions
3f05cddf9SRui Paulo  * Copyright (c) 2008-2012, Jouni Malinen <j@w1.fi>
439beb93cSSam Leffler  *
5f05cddf9SRui Paulo  * This software may be distributed under the terms of the BSD license.
6f05cddf9SRui Paulo  * See README for more details.
739beb93cSSam Leffler  */
839beb93cSSam Leffler 
939beb93cSSam Leffler #ifndef WPS_I_H
1039beb93cSSam Leffler #define WPS_I_H
1139beb93cSSam Leffler 
1239beb93cSSam Leffler #include "wps.h"
13f05cddf9SRui Paulo #include "wps_attr_parse.h"
14f05cddf9SRui Paulo 
15f05cddf9SRui Paulo struct wps_nfc_pw_token;
1639beb93cSSam Leffler 
1739beb93cSSam Leffler /**
1839beb93cSSam Leffler  * struct wps_data - WPS registration protocol data
1939beb93cSSam Leffler  *
2039beb93cSSam Leffler  * This data is stored at the EAP-WSC server/peer method and it is kept for a
2139beb93cSSam Leffler  * single registration protocol run.
2239beb93cSSam Leffler  */
2339beb93cSSam Leffler struct wps_data {
2439beb93cSSam Leffler 	/**
2539beb93cSSam Leffler 	 * wps - Pointer to long term WPS context
2639beb93cSSam Leffler 	 */
2739beb93cSSam Leffler 	struct wps_context *wps;
2839beb93cSSam Leffler 
2939beb93cSSam Leffler 	/**
3039beb93cSSam Leffler 	 * registrar - Whether this end is a Registrar
3139beb93cSSam Leffler 	 */
3239beb93cSSam Leffler 	int registrar;
3339beb93cSSam Leffler 
34e28a4053SRui Paulo 	/**
35e28a4053SRui Paulo 	 * er - Whether the local end is an external registrar
36e28a4053SRui Paulo 	 */
37e28a4053SRui Paulo 	int er;
38e28a4053SRui Paulo 
3939beb93cSSam Leffler 	enum {
4039beb93cSSam Leffler 		/* Enrollee states */
4139beb93cSSam Leffler 		SEND_M1, RECV_M2, SEND_M3, RECV_M4, SEND_M5, RECV_M6, SEND_M7,
4239beb93cSSam Leffler 		RECV_M8, RECEIVED_M2D, WPS_MSG_DONE, RECV_ACK, WPS_FINISHED,
4339beb93cSSam Leffler 		SEND_WSC_NACK,
4439beb93cSSam Leffler 
4539beb93cSSam Leffler 		/* Registrar states */
4639beb93cSSam Leffler 		RECV_M1, SEND_M2, RECV_M3, SEND_M4, RECV_M5, SEND_M6,
4739beb93cSSam Leffler 		RECV_M7, SEND_M8, RECV_DONE, SEND_M2D, RECV_M2D_ACK
4839beb93cSSam Leffler 	} state;
4939beb93cSSam Leffler 
5039beb93cSSam Leffler 	u8 uuid_e[WPS_UUID_LEN];
5139beb93cSSam Leffler 	u8 uuid_r[WPS_UUID_LEN];
5239beb93cSSam Leffler 	u8 mac_addr_e[ETH_ALEN];
5339beb93cSSam Leffler 	u8 nonce_e[WPS_NONCE_LEN];
5439beb93cSSam Leffler 	u8 nonce_r[WPS_NONCE_LEN];
5539beb93cSSam Leffler 	u8 psk1[WPS_PSK_LEN];
5639beb93cSSam Leffler 	u8 psk2[WPS_PSK_LEN];
5739beb93cSSam Leffler 	u8 snonce[2 * WPS_SECRET_NONCE_LEN];
5839beb93cSSam Leffler 	u8 peer_hash1[WPS_HASH_LEN];
5939beb93cSSam Leffler 	u8 peer_hash2[WPS_HASH_LEN];
6039beb93cSSam Leffler 
6139beb93cSSam Leffler 	struct wpabuf *dh_privkey;
6239beb93cSSam Leffler 	struct wpabuf *dh_pubkey_e;
6339beb93cSSam Leffler 	struct wpabuf *dh_pubkey_r;
6439beb93cSSam Leffler 	u8 authkey[WPS_AUTHKEY_LEN];
6539beb93cSSam Leffler 	u8 keywrapkey[WPS_KEYWRAPKEY_LEN];
6639beb93cSSam Leffler 	u8 emsk[WPS_EMSK_LEN];
6739beb93cSSam Leffler 
6839beb93cSSam Leffler 	struct wpabuf *last_msg;
6939beb93cSSam Leffler 
7039beb93cSSam Leffler 	u8 *dev_password;
7139beb93cSSam Leffler 	size_t dev_password_len;
7239beb93cSSam Leffler 	u16 dev_pw_id;
7339beb93cSSam Leffler 	int pbc;
745b9c547cSRui Paulo 	u8 *alt_dev_password;
755b9c547cSRui Paulo 	size_t alt_dev_password_len;
765b9c547cSRui Paulo 	u16 alt_dev_pw_id;
775b9c547cSRui Paulo 
785b9c547cSRui Paulo 	u8 peer_pubkey_hash[WPS_OOB_PUBKEY_HASH_LEN];
795b9c547cSRui Paulo 	int peer_pubkey_hash_set;
8039beb93cSSam Leffler 
8139beb93cSSam Leffler 	/**
8239beb93cSSam Leffler 	 * request_type - Request Type attribute from (Re)AssocReq
8339beb93cSSam Leffler 	 */
8439beb93cSSam Leffler 	u8 request_type;
8539beb93cSSam Leffler 
8639beb93cSSam Leffler 	/**
8739beb93cSSam Leffler 	 * encr_type - Available encryption types
8839beb93cSSam Leffler 	 */
8939beb93cSSam Leffler 	u16 encr_type;
9039beb93cSSam Leffler 
9139beb93cSSam Leffler 	/**
9239beb93cSSam Leffler 	 * auth_type - Available authentication types
9339beb93cSSam Leffler 	 */
9439beb93cSSam Leffler 	u16 auth_type;
9539beb93cSSam Leffler 
9639beb93cSSam Leffler 	u8 *new_psk;
9739beb93cSSam Leffler 	size_t new_psk_len;
9839beb93cSSam Leffler 
9939beb93cSSam Leffler 	int wps_pin_revealed;
10039beb93cSSam Leffler 	struct wps_credential cred;
10139beb93cSSam Leffler 
10239beb93cSSam Leffler 	struct wps_device_data peer_dev;
10339beb93cSSam Leffler 
10439beb93cSSam Leffler 	/**
10539beb93cSSam Leffler 	 * config_error - Configuration Error value to be used in NACK
10639beb93cSSam Leffler 	 */
10739beb93cSSam Leffler 	u16 config_error;
108f05cddf9SRui Paulo 	u16 error_indication;
10939beb93cSSam Leffler 
11039beb93cSSam Leffler 	int ext_reg;
111e28a4053SRui Paulo 	int int_reg;
112e28a4053SRui Paulo 
113e28a4053SRui Paulo 	struct wps_credential *new_ap_settings;
114e28a4053SRui Paulo 
115e28a4053SRui Paulo 	void *dh_ctx;
116e28a4053SRui Paulo 
117e28a4053SRui Paulo 	void (*ap_settings_cb)(void *ctx, const struct wps_credential *cred);
118e28a4053SRui Paulo 	void *ap_settings_cb_ctx;
119e28a4053SRui Paulo 
120e28a4053SRui Paulo 	struct wps_credential *use_cred;
121e28a4053SRui Paulo 
122e28a4053SRui Paulo 	int use_psk_key;
123f05cddf9SRui Paulo 	u8 p2p_dev_addr[ETH_ALEN]; /* P2P Device Address of the client or
124f05cddf9SRui Paulo 				    * 00:00:00:00:00:00 if not a P2p client */
125f05cddf9SRui Paulo 	int pbc_in_m1;
126f05cddf9SRui Paulo 
127f05cddf9SRui Paulo 	struct wps_nfc_pw_token *nfc_pw_token;
1284bc52338SCy Schubert 
1294bc52338SCy Schubert 	int multi_ap_backhaul_sta;
130*a90b9d01SCy Schubert 	int multi_ap_profile;
13139beb93cSSam Leffler };
13239beb93cSSam Leffler 
13339beb93cSSam Leffler 
13439beb93cSSam Leffler /* wps_common.c */
13539beb93cSSam Leffler void wps_kdf(const u8 *key, const u8 *label_prefix, size_t label_prefix_len,
13639beb93cSSam Leffler 	     const char *label, u8 *res, size_t res_len);
13739beb93cSSam Leffler int wps_derive_keys(struct wps_data *wps);
138780fb4a2SCy Schubert int wps_derive_psk(struct wps_data *wps, const u8 *dev_passwd,
13939beb93cSSam Leffler 		   size_t dev_passwd_len);
14039beb93cSSam Leffler struct wpabuf * wps_decrypt_encr_settings(struct wps_data *wps, const u8 *encr,
14139beb93cSSam Leffler 					  size_t encr_len);
142f05cddf9SRui Paulo void wps_fail_event(struct wps_context *wps, enum wps_msg_type msg,
1435b9c547cSRui Paulo 		    u16 config_error, u16 error_indication, const u8 *mac_addr);
1445b9c547cSRui Paulo void wps_success_event(struct wps_context *wps, const u8 *mac_addr);
1455b9c547cSRui Paulo void wps_pwd_auth_fail_event(struct wps_context *wps, int enrollee, int part,
1465b9c547cSRui Paulo 			     const u8 *mac_addr);
1473157ba21SRui Paulo void wps_pbc_overlap_event(struct wps_context *wps);
1483157ba21SRui Paulo void wps_pbc_timeout_event(struct wps_context *wps);
1495b9c547cSRui Paulo void wps_pbc_active_event(struct wps_context *wps);
1505b9c547cSRui Paulo void wps_pbc_disable_event(struct wps_context *wps);
15139beb93cSSam Leffler 
152f05cddf9SRui Paulo struct wpabuf * wps_build_wsc_ack(struct wps_data *wps);
153f05cddf9SRui Paulo struct wpabuf * wps_build_wsc_nack(struct wps_data *wps);
15439beb93cSSam Leffler 
15539beb93cSSam Leffler /* wps_attr_build.c */
15639beb93cSSam Leffler int wps_build_public_key(struct wps_data *wps, struct wpabuf *msg);
15739beb93cSSam Leffler int wps_build_req_type(struct wpabuf *msg, enum wps_request_type type);
158e28a4053SRui Paulo int wps_build_resp_type(struct wpabuf *msg, enum wps_response_type type);
15939beb93cSSam Leffler int wps_build_config_methods(struct wpabuf *msg, u16 methods);
16039beb93cSSam Leffler int wps_build_uuid_e(struct wpabuf *msg, const u8 *uuid);
16139beb93cSSam Leffler int wps_build_dev_password_id(struct wpabuf *msg, u16 id);
16239beb93cSSam Leffler int wps_build_config_error(struct wpabuf *msg, u16 err);
16339beb93cSSam Leffler int wps_build_authenticator(struct wps_data *wps, struct wpabuf *msg);
16439beb93cSSam Leffler int wps_build_key_wrap_auth(struct wps_data *wps, struct wpabuf *msg);
16539beb93cSSam Leffler int wps_build_encr_settings(struct wps_data *wps, struct wpabuf *msg,
16639beb93cSSam Leffler 			    struct wpabuf *plain);
16739beb93cSSam Leffler int wps_build_version(struct wpabuf *msg);
168f05cddf9SRui Paulo int wps_build_wfa_ext(struct wpabuf *msg, int req_to_enroll,
1694bc52338SCy Schubert 		      const u8 *auth_macs, size_t auth_macs_count,
1704bc52338SCy Schubert 		      u8 multi_ap_subelem);
17139beb93cSSam Leffler int wps_build_msg_type(struct wpabuf *msg, enum wps_msg_type msg_type);
17239beb93cSSam Leffler int wps_build_enrollee_nonce(struct wps_data *wps, struct wpabuf *msg);
17339beb93cSSam Leffler int wps_build_registrar_nonce(struct wps_data *wps, struct wpabuf *msg);
17439beb93cSSam Leffler int wps_build_auth_type_flags(struct wps_data *wps, struct wpabuf *msg);
17539beb93cSSam Leffler int wps_build_encr_type_flags(struct wps_data *wps, struct wpabuf *msg);
17639beb93cSSam Leffler int wps_build_conn_type_flags(struct wps_data *wps, struct wpabuf *msg);
17739beb93cSSam Leffler int wps_build_assoc_state(struct wps_data *wps, struct wpabuf *msg);
178f05cddf9SRui Paulo int wps_build_oob_dev_pw(struct wpabuf *msg, u16 dev_pw_id,
179f05cddf9SRui Paulo 			 const struct wpabuf *pubkey, const u8 *dev_pw,
180f05cddf9SRui Paulo 			 size_t dev_pw_len);
181f05cddf9SRui Paulo struct wpabuf * wps_ie_encapsulate(struct wpabuf *data);
1825b9c547cSRui Paulo int wps_build_mac_addr(struct wpabuf *msg, const u8 *addr);
1835b9c547cSRui Paulo int wps_build_rf_bands_attr(struct wpabuf *msg, u8 rf_bands);
1845b9c547cSRui Paulo int wps_build_ap_channel(struct wpabuf *msg, u16 ap_channel);
18539beb93cSSam Leffler 
18639beb93cSSam Leffler /* wps_attr_process.c */
18739beb93cSSam Leffler int wps_process_authenticator(struct wps_data *wps, const u8 *authenticator,
18839beb93cSSam Leffler 			      const struct wpabuf *msg);
18939beb93cSSam Leffler int wps_process_key_wrap_auth(struct wps_data *wps, struct wpabuf *msg,
19039beb93cSSam Leffler 			      const u8 *key_wrap_auth);
19139beb93cSSam Leffler int wps_process_cred(struct wps_parse_attr *attr,
19239beb93cSSam Leffler 		     struct wps_credential *cred);
19339beb93cSSam Leffler int wps_process_ap_settings(struct wps_parse_attr *attr,
19439beb93cSSam Leffler 			    struct wps_credential *cred);
19539beb93cSSam Leffler 
19639beb93cSSam Leffler /* wps_enrollee.c */
19739beb93cSSam Leffler struct wpabuf * wps_enrollee_get_msg(struct wps_data *wps,
19839beb93cSSam Leffler 				     enum wsc_op_code *op_code);
19939beb93cSSam Leffler enum wps_process_res wps_enrollee_process_msg(struct wps_data *wps,
20039beb93cSSam Leffler 					      enum wsc_op_code op_code,
20139beb93cSSam Leffler 					      const struct wpabuf *msg);
20239beb93cSSam Leffler 
20339beb93cSSam Leffler /* wps_registrar.c */
20439beb93cSSam Leffler struct wpabuf * wps_registrar_get_msg(struct wps_data *wps,
20539beb93cSSam Leffler 				      enum wsc_op_code *op_code);
20639beb93cSSam Leffler enum wps_process_res wps_registrar_process_msg(struct wps_data *wps,
20739beb93cSSam Leffler 					       enum wsc_op_code op_code,
20839beb93cSSam Leffler 					       const struct wpabuf *msg);
209e28a4053SRui Paulo int wps_build_cred(struct wps_data *wps, struct wpabuf *msg);
210e28a4053SRui Paulo int wps_device_store(struct wps_registrar *reg,
211e28a4053SRui Paulo 		     struct wps_device_data *dev, const u8 *uuid);
2125b9c547cSRui Paulo void wps_registrar_selected_registrar_changed(struct wps_registrar *reg,
2135b9c547cSRui Paulo 					      u16 dev_pw_id);
214f05cddf9SRui Paulo const u8 * wps_authorized_macs(struct wps_registrar *reg, size_t *count);
215f05cddf9SRui Paulo int wps_registrar_pbc_overlap(struct wps_registrar *reg,
216f05cddf9SRui Paulo 			      const u8 *addr, const u8 *uuid_e);
217f05cddf9SRui Paulo void wps_registrar_remove_nfc_pw_token(struct wps_registrar *reg,
218f05cddf9SRui Paulo 				       struct wps_nfc_pw_token *token);
2195b9c547cSRui Paulo int wps_cb_new_psk(struct wps_registrar *reg, const u8 *mac_addr,
2205b9c547cSRui Paulo 		   const u8 *p2p_dev_addr, const u8 *psk, size_t psk_len);
22139beb93cSSam Leffler 
22239beb93cSSam Leffler #endif /* WPS_I_H */
223