OSDN Git Service

wpa_supplicant: Update to 07-Jul-2012 TOT
[android-x86/external-wpa_supplicant_8.git] / src / wps / wps_attr_build.c
index 753083d..9be30b9 100644 (file)
@@ -30,6 +30,14 @@ int wps_build_public_key(struct wps_data *wps, struct wpabuf *msg)
                wps->dh_ctx = wps->wps->dh_ctx;
                wps->wps->dh_ctx = NULL;
                pubkey = wpabuf_dup(wps->wps->dh_pubkey);
+#ifdef CONFIG_WPS_NFC
+       } else if (wps->dev_pw_id >= 0x10 && wps->wps->ap &&
+                  wps->dev_pw_id == wps->wps->ap_nfc_dev_pw_id) {
+               wpa_printf(MSG_DEBUG, "WPS: Using NFC password token DH keys");
+               wps->dh_privkey = wpabuf_dup(wps->wps->ap_nfc_dh_privkey);
+               pubkey = wpabuf_dup(wps->wps->ap_nfc_dh_pubkey);
+               wps->dh_ctx = dh5_init_fixed(wps->dh_privkey, pubkey);
+#endif /* CONFIG_WPS_NFC */
        } else {
                wpa_printf(MSG_DEBUG, "WPS: Generate new DH keys");
                wps->dh_privkey = NULL;
@@ -340,19 +348,34 @@ int wps_build_encr_settings(struct wps_data *wps, struct wpabuf *msg,
 
 
 #ifdef CONFIG_WPS_OOB
-int wps_build_oob_dev_password(struct wpabuf *msg, struct wps_context *wps)
+int wps_build_oob_dev_pw(struct wpabuf *msg, u16 dev_pw_id,
+                        const struct wpabuf *pubkey, const u8 *dev_pw,
+                        size_t dev_pw_len)
 {
        size_t hash_len;
        const u8 *addr[1];
        u8 pubkey_hash[WPS_HASH_LEN];
+
+       addr[0] = wpabuf_head(pubkey);
+       hash_len = wpabuf_len(pubkey);
+       sha256_vector(1, addr, &hash_len, pubkey_hash);
+
+       wpabuf_put_be16(msg, ATTR_OOB_DEVICE_PASSWORD);
+       wpabuf_put_be16(msg, WPS_OOB_PUBKEY_HASH_LEN + 2 + dev_pw_len);
+       wpabuf_put_data(msg, pubkey_hash, WPS_OOB_PUBKEY_HASH_LEN);
+       wpabuf_put_be16(msg, dev_pw_id);
+       wpabuf_put_data(msg, dev_pw, dev_pw_len);
+
+       return 0;
+}
+
+
+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");
 
-       addr[0] = wpabuf_head(wps->dh_pubkey);
-       hash_len = wpabuf_len(wps->dh_pubkey);
-       sha256_vector(1, addr, &hash_len, pubkey_hash);
-
        if (os_get_random((u8 *) &wps->oob_dev_pw_id, sizeof(u16)) < 0) {
                wpa_printf(MSG_ERROR, "WPS: device password id "
                           "generation error");
@@ -367,19 +390,15 @@ int wps_build_oob_dev_password(struct wpabuf *msg, struct wps_context *wps)
                return -1;
        }
 
-       wpabuf_put_be16(msg, ATTR_OOB_DEVICE_PASSWORD);
-       wpabuf_put_be16(msg, WPS_OOB_DEVICE_PASSWORD_ATTR_LEN);
-       wpabuf_put_data(msg, pubkey_hash, WPS_OOB_PUBKEY_HASH_LEN);
-       wpabuf_put_be16(msg, wps->oob_dev_pw_id);
-       wpabuf_put_data(msg, dev_password_bin, WPS_OOB_DEVICE_PASSWORD_LEN);
-
        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 0;
+       return wps_build_oob_dev_pw(msg, wps->oob_dev_pw_id, wps->dh_pubkey,
+                                   dev_password_bin,
+                                   WPS_OOB_DEVICE_PASSWORD_LEN);
 }
 #endif /* CONFIG_WPS_OOB */