Merge "WifiHal: Add support to accept either passphrase or pmk"
am: 2931ad23a4

Change-Id: I5fc6a53d2419d863d4d1a55caa7cc85171819f16
diff --git a/qcwcn/wifi_hal/nan.cpp b/qcwcn/wifi_hal/nan.cpp
index 7efa503..73cdc75 100644
--- a/qcwcn/wifi_hal/nan.cpp
+++ b/qcwcn/wifi_hal/nan.cpp
@@ -32,6 +32,8 @@
 #define STRUCT_PACKED
 #endif
 
+#define OUT_OF_BAND_SERVICE_INSTANCE_ID 0
+
 //Singleton Static Instance
 NanCommand* NanCommand::mNanCommandInstance  = NULL;
 
@@ -785,6 +787,22 @@
         return (wifi_error)ret;
     }
 
+    if ((msg->cipher_type != NAN_CIPHER_SUITE_SHARED_KEY_NONE) &&
+        (msg->key_info.body.pmk_info.pmk_len == 0) &&
+        (msg->key_info.body.passphrase_info.passphrase_len == 0)) {
+        ALOGE("%s: Failed-Initiator req, missing pmk and passphrase",
+               __FUNCTION__);
+        return WIFI_ERROR_INVALID_ARGS;
+    }
+
+    if ((msg->cipher_type != NAN_CIPHER_SUITE_SHARED_KEY_NONE) &&
+        (msg->requestor_instance_id == OUT_OF_BAND_SERVICE_INSTANCE_ID) &&
+        (msg->service_name_len == 0)) {
+        ALOGE("%s: Failed-Initiator req, missing service name for out of band request",
+              __FUNCTION__);
+        return WIFI_ERROR_INVALID_ARGS;
+    }
+
     /* Add the vendor specific attributes for the NL command. */
     nlData = nanCommand->attr_start(NL80211_ATTR_VENDOR_DATA);
     if (!nlData)
@@ -852,11 +870,30 @@
         if (nanCommand->put_u32(QCA_WLAN_VENDOR_ATTR_NDP_CSID,
                 msg->cipher_type))
             goto cleanup;
-    }
-    if (msg->pmk_len == NAN_PMK_INFO_LEN) {
-        if (nanCommand->put_bytes(QCA_WLAN_VENDOR_ATTR_NDP_PMK,
-            (char *)msg->pmk, msg->pmk_len))
-            goto cleanup;
+
+        if ( msg->key_info.key_type == NAN_SECURITY_KEY_INPUT_PMK &&
+             msg->key_info.body.pmk_info.pmk_len == NAN_PMK_INFO_LEN) {
+            if (nanCommand->put_bytes(QCA_WLAN_VENDOR_ATTR_NDP_PMK,
+                (char *)msg->key_info.body.pmk_info.pmk,
+                msg->key_info.body.pmk_info.pmk_len))
+                goto cleanup;
+        } else if (msg->key_info.key_type ==
+            NAN_SECURITY_KEY_INPUT_PASSPHRASE &&
+            msg->key_info.body.passphrase_info.passphrase_len >=
+            NAN_SECURITY_MIN_PASSPHRASE_LEN &&
+            msg->key_info.body.passphrase_info.passphrase_len <=
+            NAN_SECURITY_MAX_PASSPHRASE_LEN) {
+            if (nanCommand->put_bytes(QCA_WLAN_VENDOR_ATTR_NDP_PASSPHRASE,
+                (char *)msg->key_info.body.passphrase_info.passphrase,
+                msg->key_info.body.passphrase_info.passphrase_len))
+                goto cleanup;
+        }
+
+        if (msg->service_name_len) {
+            if (nanCommand->put_bytes(QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_NAME,
+                (char *)msg->service_name, msg->service_name_len))
+                goto cleanup;
+        }
     }
     nanCommand->attr_end(nlData);
 
@@ -888,6 +925,14 @@
         return (wifi_error)ret;
     }
 
+    if ((msg->cipher_type != NAN_CIPHER_SUITE_SHARED_KEY_NONE) &&
+        (msg->key_info.body.pmk_info.pmk_len == 0) &&
+        (msg->key_info.body.passphrase_info.passphrase_len == 0)) {
+        ALOGE("%s: Failed-Initiator req, missing pmk and passphrase",
+               __FUNCTION__);
+        return WIFI_ERROR_INVALID_ARGS;
+    }
+
     /* Add the vendor specific attributes for the NL command. */
     nlData = nanCommand->attr_start(NL80211_ATTR_VENDOR_DATA);
     if (!nlData)
@@ -944,11 +989,29 @@
         if (nanCommand->put_u32(QCA_WLAN_VENDOR_ATTR_NDP_CSID,
                 msg->cipher_type))
             goto cleanup;
-    }
-    if (msg->pmk_len == NAN_PMK_INFO_LEN) {
-        if (nanCommand->put_bytes(QCA_WLAN_VENDOR_ATTR_NDP_PMK,
-            (char *)msg->pmk, msg->pmk_len))
-            goto cleanup;
+
+        if ( msg->key_info.key_type == NAN_SECURITY_KEY_INPUT_PMK &&
+             msg->key_info.body.pmk_info.pmk_len == NAN_PMK_INFO_LEN) {
+            if (nanCommand->put_bytes(QCA_WLAN_VENDOR_ATTR_NDP_PMK,
+                (char *)msg->key_info.body.pmk_info.pmk,
+                msg->key_info.body.pmk_info.pmk_len))
+                goto cleanup;
+        } else if (msg->key_info.key_type == NAN_SECURITY_KEY_INPUT_PASSPHRASE &&
+            msg->key_info.body.passphrase_info.passphrase_len >=
+            NAN_SECURITY_MIN_PASSPHRASE_LEN &&
+            msg->key_info.body.passphrase_info.passphrase_len <=
+            NAN_SECURITY_MAX_PASSPHRASE_LEN) {
+            if (nanCommand->put_bytes(QCA_WLAN_VENDOR_ATTR_NDP_PASSPHRASE,
+                (char *)msg->key_info.body.passphrase_info.passphrase,
+                msg->key_info.body.passphrase_info.passphrase_len))
+                goto cleanup;
+        }
+
+        if (msg->service_name_len) {
+            if (nanCommand->put_bytes(QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_NAME,
+                (char *)msg->service_name, msg->service_name_len))
+                goto cleanup;
+        }
     }
     nanCommand->attr_end(nlData);
 
diff --git a/qcwcn/wifi_hal/nan_i.h b/qcwcn/wifi_hal/nan_i.h
index 8a3ae3b..26f6b2b 100644
--- a/qcwcn/wifi_hal/nan_i.h
+++ b/qcwcn/wifi_hal/nan_i.h
@@ -167,6 +167,7 @@
     NAN_TLV_TYPE_NAN20_RANGING_REQUEST = 24,
     NAN_TLV_TYPE_NAN20_RANGING_RESULT = 25,
     NAN_TLV_TYPE_NAN20_RANGING_REQUEST_RECEIVED = 26,
+    NAN_TLV_TYPE_NAN_PASSPHRASE = 27,
     NAN_TLV_TYPE_SDEA_SERVICE_SPECIFIC_INFO = 28,
     NAN_TLV_TYPE_SDF_LAST = 4095,
 
diff --git a/qcwcn/wifi_hal/nan_req.cpp b/qcwcn/wifi_hal/nan_req.cpp
index 735936d..7f96568 100644
--- a/qcwcn/wifi_hal/nan_req.cpp
+++ b/qcwcn/wifi_hal/nan_req.cpp
@@ -568,7 +568,6 @@
         (pReq->tx_match_filter_len ? SIZEOF_TLV_HDR + pReq->tx_match_filter_len : 0) +
         (SIZEOF_TLV_HDR + sizeof(NanServiceAcceptPolicy)) +
         (pReq->cipher_type ? SIZEOF_TLV_HDR + sizeof(NanCsidType) : 0) +
-        (pReq->pmk_len ? SIZEOF_TLV_HDR + NAN_PMK_INFO_LEN : 0) +
         ((pReq->sdea_params.config_nan_data_path || pReq->sdea_params.security_cfg ||
           pReq->sdea_params.ranging_state || pReq->sdea_params.range_report) ?
           SIZEOF_TLV_HDR + sizeof(NanFWSdeaCtrlParams) : 0) +
@@ -580,6 +579,17 @@
           SIZEOF_TLV_HDR + sizeof(NanFWRangeReqMsg) : 0)  +
         (pReq->sdea_service_specific_info_len ? SIZEOF_TLV_HDR + pReq->sdea_service_specific_info_len : 0);
 
+    if ((pReq->key_info.key_type ==  NAN_SECURITY_KEY_INPUT_PMK) &&
+        (pReq->key_info.body.pmk_info.pmk_len == NAN_PMK_INFO_LEN))
+        message_len += SIZEOF_TLV_HDR + NAN_PMK_INFO_LEN;
+    else if ((pReq->key_info.key_type ==  NAN_SECURITY_KEY_INPUT_PASSPHRASE) &&
+             (pReq->key_info.body.passphrase_info.passphrase_len >=
+              NAN_SECURITY_MIN_PASSPHRASE_LEN) &&
+             (pReq->key_info.body.passphrase_info.passphrase_len <=
+              NAN_SECURITY_MAX_PASSPHRASE_LEN))
+        message_len += SIZEOF_TLV_HDR +
+                       pReq->key_info.body.passphrase_info.passphrase_len;
+
     pNanPublishServiceReqMsg pFwReq = (pNanPublishServiceReqMsg)malloc(message_len);
     if (pFwReq == NULL) {
         cleanup();
@@ -645,10 +655,23 @@
         tlvs = addTlv(NAN_TLV_TYPE_NAN_CSID, sizeof(NanCsidType),
                         (const u8*)&pNanCsidType, tlvs);
     }
-    if (pReq->pmk_len) {
-        tlvs = addTlv(NAN_TLV_TYPE_NAN_PMK, pReq->pmk_len,
-                      (const u8*)&pReq->pmk[0], tlvs);
+
+    if ((pReq->key_info.key_type ==  NAN_SECURITY_KEY_INPUT_PMK) &&
+        (pReq->key_info.body.pmk_info.pmk_len == NAN_PMK_INFO_LEN)) {
+        tlvs = addTlv(NAN_TLV_TYPE_NAN_PMK,
+                      pReq->key_info.body.pmk_info.pmk_len,
+                      (const u8*)&pReq->key_info.body.pmk_info.pmk[0], tlvs);
+    } else if ((pReq->key_info.key_type == NAN_SECURITY_KEY_INPUT_PASSPHRASE) &&
+        (pReq->key_info.body.passphrase_info.passphrase_len >=
+         NAN_SECURITY_MIN_PASSPHRASE_LEN) &&
+        (pReq->key_info.body.passphrase_info.passphrase_len <=
+         NAN_SECURITY_MAX_PASSPHRASE_LEN)) {
+        tlvs = addTlv(NAN_TLV_TYPE_NAN_PASSPHRASE,
+                  pReq->key_info.body.passphrase_info.passphrase_len,
+                  (const u8*)&pReq->key_info.body.passphrase_info.passphrase[0],
+                  tlvs);
     }
+
     if (pReq->sdea_params.config_nan_data_path ||
         pReq->sdea_params.security_cfg ||
         pReq->sdea_params.ranging_state ||
@@ -794,7 +817,6 @@
         (pReq->rx_match_filter_len ? SIZEOF_TLV_HDR + pReq->rx_match_filter_len : 0) +
         (pReq->tx_match_filter_len ? SIZEOF_TLV_HDR + pReq->tx_match_filter_len : 0) +
         (pReq->cipher_type ? SIZEOF_TLV_HDR + sizeof(NanCsidType) : 0) +
-        (pReq->pmk_len ? SIZEOF_TLV_HDR + NAN_PMK_INFO_LEN : 0) +
         ((pReq->sdea_params.config_nan_data_path || pReq->sdea_params.security_cfg ||
           pReq->sdea_params.ranging_state || pReq->sdea_params.range_report) ?
           SIZEOF_TLV_HDR + sizeof(NanFWSdeaCtrlParams) : 0) +
@@ -809,6 +831,19 @@
     message_len += \
         (pReq->num_intf_addr_present * (SIZEOF_TLV_HDR + NAN_MAC_ADDR_LEN));
 
+
+    if ((pReq->key_info.key_type ==  NAN_SECURITY_KEY_INPUT_PMK) &&
+        (pReq->key_info.body.pmk_info.pmk_len == NAN_PMK_INFO_LEN))
+        message_len += SIZEOF_TLV_HDR + NAN_PMK_INFO_LEN;
+    else if ((pReq->key_info.key_type ==  NAN_SECURITY_KEY_INPUT_PASSPHRASE) &&
+             (pReq->key_info.body.passphrase_info.passphrase_len >=
+              NAN_SECURITY_MIN_PASSPHRASE_LEN) &&
+             (pReq->key_info.body.passphrase_info.passphrase_len <=
+              NAN_SECURITY_MAX_PASSPHRASE_LEN))
+        message_len += SIZEOF_TLV_HDR +
+                       pReq->key_info.body.passphrase_info.passphrase_len;
+
+
     pNanSubscribeServiceReqMsg pFwReq = (pNanSubscribeServiceReqMsg)malloc(message_len);
     if (pFwReq == NULL) {
         cleanup();
@@ -878,10 +913,23 @@
         tlvs = addTlv(NAN_TLV_TYPE_NAN_CSID, sizeof(NanCsidType),
                         (const u8*)&pNanCsidType, tlvs);
     }
-    if (pReq->pmk_len) {
-        tlvs = addTlv(NAN_TLV_TYPE_NAN_PMK, pReq->pmk_len,
-                      (const u8*)&pReq->pmk[0], tlvs);
+
+    if ((pReq->key_info.key_type ==  NAN_SECURITY_KEY_INPUT_PMK) &&
+        (pReq->key_info.body.pmk_info.pmk_len == NAN_PMK_INFO_LEN)) {
+        tlvs = addTlv(NAN_TLV_TYPE_NAN_PMK,
+                      pReq->key_info.body.pmk_info.pmk_len,
+                      (const u8*)&pReq->key_info.body.pmk_info.pmk[0], tlvs);
+    } else if ((pReq->key_info.key_type == NAN_SECURITY_KEY_INPUT_PASSPHRASE) &&
+        (pReq->key_info.body.passphrase_info.passphrase_len >=
+         NAN_SECURITY_MIN_PASSPHRASE_LEN) &&
+        (pReq->key_info.body.passphrase_info.passphrase_len <=
+         NAN_SECURITY_MAX_PASSPHRASE_LEN)) {
+        tlvs = addTlv(NAN_TLV_TYPE_NAN_PASSPHRASE,
+                  pReq->key_info.body.passphrase_info.passphrase_len,
+                  (const u8*)&pReq->key_info.body.passphrase_info.passphrase[0],
+                  tlvs);
     }
+
     if (pReq->sdea_params.config_nan_data_path ||
         pReq->sdea_params.security_cfg ||
         pReq->sdea_params.ranging_state ||
diff --git a/qcwcn/wifi_hal/vendor_definitions.h b/qcwcn/wifi_hal/vendor_definitions.h
index ac8afcd..ea105fa 100644
--- a/qcwcn/wifi_hal/vendor_definitions.h
+++ b/qcwcn/wifi_hal/vendor_definitions.h
@@ -364,6 +364,12 @@
     QCA_WLAN_VENDOR_ATTR_NDP_CSID,
     /* Array of u8: len = NAN_PMK_INFO_LEN */
     QCA_WLAN_VENDOR_ATTR_NDP_PMK,
+    QCA_WLAN_VENDOR_ATTR_NDP_SCID,
+    /* Array of u8: len = NAN_SECURITY_MAX_PASSPHRASE_LEN*/
+    QCA_WLAN_VENDOR_ATTR_NDP_PASSPHRASE,
+    /* Array of u8: len = NAN_MAX_SERVICE_NAME_LEN */
+    QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_NAME,
+
 
     /* KEEP LAST */
     QCA_WLAN_VENDOR_ATTR_NDP_AFTER_LAST,