P2P NFC: Add WPS attribute building for P2P NFC

These functions can be used to build the WPS attributes for P2P NFC
connection handover messages.

Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
Jouni Malinen 2013-02-15 17:07:28 +02:00 committed by Jouni Malinen
parent 01afd8dbd7
commit 5154689468
4 changed files with 98 additions and 2 deletions

View 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);

View 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 */

View 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");

View 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);