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