int wps_build_oob_dev_password(struct wpabuf *msg, struct wps_context *wps) { u8 dev_password_bin[WPS_OOB_DEVICE_PASSWORD_LEN]; wpa_printf(MSG_DEBUG, "WPS: * OOB Device Password"); if (os_get_random((u8 *) &wps->oob_dev_pw_id, sizeof(u16)) < 0) { wpa_printf(MSG_ERROR, "WPS: device password id " "generation error"); return -1; } wps->oob_dev_pw_id |= 0x0010; if (random_get_bytes(dev_password_bin, WPS_OOB_DEVICE_PASSWORD_LEN) < 0) { wpa_printf(MSG_ERROR, "WPS: OOB device password " "generation error"); return -1; } wpa_snprintf_hex_uppercase( wpabuf_put(wps->oob_conf.dev_password, wpabuf_size(wps->oob_conf.dev_password)), wpabuf_size(wps->oob_conf.dev_password), dev_password_bin, WPS_OOB_DEVICE_PASSWORD_LEN); return wps_build_oob_dev_pw(msg, wps->oob_dev_pw_id, wps->dh_pubkey, dev_password_bin, WPS_OOB_DEVICE_PASSWORD_LEN); }
struct wpabuf * wps_build_nfc_handover_req_p2p(struct wps_context *ctx, struct wpabuf *nfc_dh_pubkey) { struct wpabuf *msg; if (ctx == NULL) return NULL; wpa_printf(MSG_DEBUG, "WPS: Building attributes for NFC connection " "handover request (P2P)"); if (nfc_dh_pubkey == NULL) { wpa_printf(MSG_DEBUG, "WPS: No NFC DH Public Key configured"); return NULL; } msg = wpabuf_alloc(1000); if (msg == NULL) return msg; if (wps_build_manufacturer(&ctx->dev, msg) || wps_build_model_name(&ctx->dev, msg) || wps_build_model_number(&ctx->dev, msg) || wps_build_oob_dev_pw(msg, DEV_PW_NFC_CONNECTION_HANDOVER, nfc_dh_pubkey, NULL, 0) || wps_build_rf_bands(&ctx->dev, msg, 0) || wps_build_serial_number(&ctx->dev, msg) || wps_build_uuid_e(msg, ctx->uuid) || wps_build_wfa_ext(msg, 0, NULL, 0)) { wpabuf_free(msg); return NULL; } return msg; }
struct wpabuf * wps_build_nfc_handover_req(struct wps_context *ctx, struct wpabuf *nfc_dh_pubkey) { struct wpabuf *msg; void *len; if (ctx == NULL) return NULL; wpa_printf(MSG_DEBUG, "WPS: Building attributes for NFC connection " "handover request"); if (nfc_dh_pubkey == NULL) { wpa_printf(MSG_DEBUG, "WPS: No NFC OOB Device Password " "configured"); return NULL; } msg = wpabuf_alloc(1000); if (msg == NULL) return msg; len = wpabuf_put(msg, 2); if (wps_build_oob_dev_pw(msg, DEV_PW_NFC_CONNECTION_HANDOVER, nfc_dh_pubkey, NULL, 0) || wps_build_uuid_e(msg, ctx->uuid) || wps_build_wfa_ext(msg, 0, NULL, 0)) { wpabuf_free(msg); return NULL; } WPA_PUT_BE16(len, wpabuf_len(msg) - 2); return msg; }
struct wpabuf * wps_build_nfc_handover_sel_p2p(struct wps_context *ctx, int nfc_dev_pw_id, struct wpabuf *nfc_dh_pubkey, struct wpabuf *nfc_dev_pw) { struct wpabuf *msg; const u8 *dev_pw; size_t dev_pw_len; if (ctx == NULL) return NULL; wpa_printf(MSG_DEBUG, "WPS: Building attributes for NFC connection " "handover select (P2P)"); if (nfc_dh_pubkey == NULL || (nfc_dev_pw_id != DEV_PW_NFC_CONNECTION_HANDOVER && nfc_dev_pw == NULL)) { wpa_printf(MSG_DEBUG, "WPS: No NFC OOB Device Password " "configured"); return NULL; } msg = wpabuf_alloc(1000); if (msg == NULL) return msg; if (nfc_dev_pw) { dev_pw = wpabuf_head(nfc_dev_pw); dev_pw_len = wpabuf_len(nfc_dev_pw); } else { dev_pw = NULL; dev_pw_len = 0; } if (wps_build_manufacturer(&ctx->dev, msg) || wps_build_model_name(&ctx->dev, msg) || wps_build_model_number(&ctx->dev, msg) || wps_build_oob_dev_pw(msg, nfc_dev_pw_id, nfc_dh_pubkey, dev_pw, dev_pw_len) || wps_build_rf_bands(&ctx->dev, msg, 0) || wps_build_serial_number(&ctx->dev, msg) || wps_build_uuid_e(msg, ctx->uuid) || wps_build_wfa_ext(msg, 0, NULL, 0)) { wpabuf_free(msg); return NULL; } return msg; }
struct wpabuf * wps_build_nfc_pw_token(u16 dev_pw_id, const struct wpabuf *pubkey, const struct wpabuf *dev_pw) { struct wpabuf *data; data = wpabuf_alloc(200); if (data == NULL) return NULL; if (wps_build_oob_dev_pw(data, dev_pw_id, pubkey, wpabuf_head(dev_pw), wpabuf_len(dev_pw)) || wps_build_wfa_ext(data, 0, NULL, 0)) { wpa_printf(MSG_ERROR, "WPS: Failed to build NFC password " "token"); wpabuf_free(data); return NULL; } return data; }
struct wpabuf * wps_build_nfc_handover_sel(struct wps_context *ctx, struct wpabuf *nfc_dh_pubkey, const u8 *bssid, int freq) { struct wpabuf *msg; void *len; if (ctx == NULL) return NULL; wpa_printf(MSG_DEBUG, "WPS: Building attributes for NFC connection " "handover select"); if (nfc_dh_pubkey == NULL) { wpa_printf(MSG_DEBUG, "WPS: No NFC OOB Device Password " "configured"); return NULL; } msg = wpabuf_alloc(1000); if (msg == NULL) return msg; len = wpabuf_put(msg, 2); if (wps_build_oob_dev_pw(msg, DEV_PW_NFC_CONNECTION_HANDOVER, nfc_dh_pubkey, NULL, 0) || wps_build_ssid(msg, ctx) || wps_build_ap_freq(msg, freq) || (bssid && wps_build_mac_addr(msg, bssid)) || wps_build_wfa_ext(msg, 0, NULL, 0)) { wpabuf_free(msg); return NULL; } WPA_PUT_BE16(len, wpabuf_len(msg) - 2); return msg; }