]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P NFC: Add WPS attribute building for P2P NFC
authorJouni Malinen <jouni@qca.qualcomm.com>
Fri, 15 Feb 2013 15:07:28 +0000 (17:07 +0200)
committerJouni Malinen <j@w1.fi>
Mon, 27 Jan 2014 19:10:55 +0000 (21:10 +0200)
These functions can be used to build the WPS attributes for P2P NFC
connection handover messages.

Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>

src/wps/wps.h
src/wps/wps_common.c
src/wps/wps_dev_attr.c
src/wps/wps_dev_attr.h

index f185d0587a978e6388ad62acefba1a78acd68672..355939bf4c92847e38922b03bd0fdb50957095d8 100644 (file)
@@ -868,6 +868,12 @@ struct wpabuf * wps_build_nfc_handover_req(struct wps_context *ctx,
 struct wpabuf * wps_build_nfc_handover_sel(struct wps_context *ctx,
                                           struct wpabuf *nfc_dh_pubkey,
                                           const u8 *bssid, int freq);
+struct wpabuf * wps_build_nfc_handover_req_p2p(struct wps_context *ctx,
+                                              struct wpabuf *nfc_dh_pubkey);
+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);
 
 /* ndef.c */
 struct wpabuf * ndef_parse_wifi(const struct wpabuf *buf);
index 47fc8de404e96e9d90ebc0fd307e79ee3fac1ea9..e98ec003a4a3f0ec1fbeb7d0a1c8f436a8e9b570 100644 (file)
@@ -18,6 +18,7 @@
 #include "crypto/sha256.h"
 #include "crypto/random.h"
 #include "wps_i.h"
+#include "wps_dev_attr.h"
 
 
 void wps_kdf(const u8 *key, const u8 *label_prefix, size_t label_prefix_len,
@@ -809,4 +810,93 @@ struct wpabuf * wps_build_nfc_handover_sel(struct wps_context *ctx,
        return msg;
 }
 
+
+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_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;
+}
+
 #endif /* CONFIG_WPS_NFC */
index 87910b071a3db70fe47a49dd44f6ec1de499ca71..0d01211a261cbe2ed3908f9a4a6af3e95b7e7d47 100644 (file)
@@ -85,8 +85,7 @@ int wps_build_model_number(struct wps_device_data *dev, struct wpabuf *msg)
 }
 
 
-static int wps_build_serial_number(struct wps_device_data *dev,
-                                  struct wpabuf *msg)
+int wps_build_serial_number(struct wps_device_data *dev, struct wpabuf *msg)
 {
        size_t len;
        wpa_printf(MSG_DEBUG, "WPS:  * Serial Number");
index f0169a79700a211f52493a1adb2476cd24e6e3e9..c9034addbcc6495d5716900aa95aefe3ba81d2ab 100644 (file)
@@ -14,6 +14,7 @@ struct wps_parse_attr;
 int wps_build_manufacturer(struct wps_device_data *dev, struct wpabuf *msg);
 int wps_build_model_name(struct wps_device_data *dev, struct wpabuf *msg);
 int wps_build_model_number(struct wps_device_data *dev, struct wpabuf *msg);
+int wps_build_serial_number(struct wps_device_data *dev, struct wpabuf *msg);
 int wps_build_dev_name(struct wps_device_data *dev, struct wpabuf *msg);
 int wps_build_device_attrs(struct wps_device_data *dev, struct wpabuf *msg);
 int wps_build_os_version(struct wps_device_data *dev, struct wpabuf *msg);