Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d4f09708 authored by Etan Cohen's avatar Etan Cohen Committed by android-build-merger
Browse files

Merge "[AWARE] Add Passphrase data-path security" am: 9e71d7d4 am: 5a05398d

am: e3ee58a4

Change-Id: I86680b7dc7285658d5b71a8e8bc5fbf504522b96
parents f89c914b e3ee58a4
Loading
Loading
Loading
Loading
+114 −0
Original line number Diff line number Diff line
@@ -225,6 +225,44 @@ $(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (NanDataPathSecurityConfig)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathSecurityConfig.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.NanDataPathSecurityConfig

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (NanDataPathSecurityType)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathSecurityType.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.NanDataPathSecurityType

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (NanDebugConfig)
#
@@ -358,6 +396,25 @@ $(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (NanParamSizeLimits)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/NanParamSizeLimits.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.NanParamSizeLimits

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (NanPublishRequest)
#
@@ -2047,6 +2104,44 @@ $(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (NanDataPathSecurityConfig)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathSecurityConfig.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.NanDataPathSecurityConfig

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (NanDataPathSecurityType)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathSecurityType.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.NanDataPathSecurityType

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (NanDebugConfig)
#
@@ -2180,6 +2275,25 @@ $(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (NanParamSizeLimits)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/NanParamSizeLimits.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.NanParamSizeLimits

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (NanPublishRequest)
#
+143 −34
Original line number Diff line number Diff line
@@ -973,17 +973,41 @@ bool convertHidlNanPublishRequestToLegacy(
        hidl_request.baseConfigs.disableMatchExpirationIndication ? 0x2 : 0x0;
  legacy_request->recv_indication_cfg |=
        hidl_request.baseConfigs.disableFollowupReceivedIndication ? 0x4 : 0x0;
  legacy_request->cipher_type = (unsigned int) hidl_request.baseConfigs.cipherType;
  legacy_request->pmk_len = hidl_request.baseConfigs.pmk.size();
  if (legacy_request->pmk_len > NAN_PMK_INFO_LEN) {
  legacy_request->cipher_type = (unsigned int) hidl_request.baseConfigs.securityConfig.cipherType;
  if (hidl_request.baseConfigs.securityConfig.securityType == NanDataPathSecurityType::PMK) {
    legacy_request->key_info.key_type = legacy_hal::NAN_SECURITY_KEY_INPUT_PMK;
    legacy_request->key_info.body.pmk_info.pmk_len =
        hidl_request.baseConfigs.securityConfig.pmk.size();
    if (legacy_request->key_info.body.pmk_info.pmk_len > NAN_PMK_INFO_LEN) {
      LOG(ERROR) << "convertHidlNanPublishRequestToLegacy: pmk_len too large";
      return false;
    }
  memcpy(legacy_request->pmk,
        hidl_request.baseConfigs.pmk.data(),
        legacy_request->pmk_len);
  legacy_request->sdea_params.security_cfg = hidl_request.baseConfigs.securityEnabledInNdp ?
        legacy_hal::NAN_DP_CONFIG_SECURITY : legacy_hal::NAN_DP_CONFIG_NO_SECURITY;
    memcpy(legacy_request->key_info.body.pmk_info.pmk,
          hidl_request.baseConfigs.securityConfig.pmk.data(),
          legacy_request->key_info.body.pmk_info.pmk_len);
  }
  if (hidl_request.baseConfigs.securityConfig.securityType
        == NanDataPathSecurityType::PASSPHRASE) {
    legacy_request->key_info.key_type = legacy_hal::NAN_SECURITY_KEY_INPUT_PASSPHRASE;
    legacy_request->key_info.body.passphrase_info.passphrase_len =
        hidl_request.baseConfigs.securityConfig.passphrase.size();
    if (legacy_request->key_info.body.passphrase_info.passphrase_len
            < NAN_SECURITY_MIN_PASSPHRASE_LEN) {
      LOG(ERROR) << "convertHidlNanPublishRequestToLegacy: passphrase_len too small";
      return false;
    }
    if (legacy_request->key_info.body.passphrase_info.passphrase_len
            > NAN_SECURITY_MIN_PASSPHRASE_LEN) {
      LOG(ERROR) << "convertHidlNanPublishRequestToLegacy: passphrase_len too large";
      return false;
    }
    memcpy(legacy_request->key_info.body.passphrase_info.passphrase,
          hidl_request.baseConfigs.securityConfig.passphrase.data(),
          legacy_request->key_info.body.passphrase_info.passphrase_len);
  }
  legacy_request->sdea_params.security_cfg = (hidl_request.baseConfigs.securityConfig.securityType
        != NanDataPathSecurityType::OPEN) ? legacy_hal::NAN_DP_CONFIG_SECURITY
            : legacy_hal::NAN_DP_CONFIG_NO_SECURITY;
  legacy_request->sdea_params.ranging_state = hidl_request.baseConfigs.rangingRequired ?
        legacy_hal::NAN_RANGING_ENABLE : legacy_hal::NAN_RANGING_DISABLE;
  legacy_request->ranging_cfg.ranging_interval_msec = hidl_request.baseConfigs.rangingIntervalMsec;
@@ -1066,17 +1090,40 @@ bool convertHidlNanSubscribeRequestToLegacy(
        hidl_request.baseConfigs.disableMatchExpirationIndication ? 0x2 : 0x0;
  legacy_request->recv_indication_cfg |=
        hidl_request.baseConfigs.disableFollowupReceivedIndication ? 0x4 : 0x0;
  legacy_request->cipher_type = (unsigned int) hidl_request.baseConfigs.cipherType;
  legacy_request->pmk_len = hidl_request.baseConfigs.pmk.size();
  if (legacy_request->pmk_len > NAN_PMK_INFO_LEN) {
  legacy_request->cipher_type = (unsigned int) hidl_request.baseConfigs.securityConfig.cipherType;
  if (hidl_request.baseConfigs.securityConfig.securityType == NanDataPathSecurityType::PMK) {
    legacy_request->key_info.key_type = legacy_hal::NAN_SECURITY_KEY_INPUT_PMK;
    legacy_request->key_info.body.pmk_info.pmk_len =
        hidl_request.baseConfigs.securityConfig.pmk.size();
    if (legacy_request->key_info.body.pmk_info.pmk_len > NAN_PMK_INFO_LEN) {
      LOG(ERROR) << "convertHidlNanSubscribeRequestToLegacy: pmk_len too large";
      return false;
    }
  memcpy(legacy_request->pmk,
        hidl_request.baseConfigs.pmk.data(),
        legacy_request->pmk_len);
  legacy_request->sdea_params.security_cfg = hidl_request.baseConfigs.securityEnabledInNdp ?
        legacy_hal::NAN_DP_CONFIG_SECURITY : legacy_hal::NAN_DP_CONFIG_NO_SECURITY;
    memcpy(legacy_request->key_info.body.pmk_info.pmk,
          hidl_request.baseConfigs.securityConfig.pmk.data(),
          legacy_request->key_info.body.pmk_info.pmk_len);
  }
  if (hidl_request.baseConfigs.securityConfig.securityType == NanDataPathSecurityType::PASSPHRASE) {
    legacy_request->key_info.key_type = legacy_hal::NAN_SECURITY_KEY_INPUT_PASSPHRASE;
    legacy_request->key_info.body.passphrase_info.passphrase_len =
        hidl_request.baseConfigs.securityConfig.passphrase.size();
    if (legacy_request->key_info.body.passphrase_info.passphrase_len
            < NAN_SECURITY_MIN_PASSPHRASE_LEN) {
      LOG(ERROR) << "convertHidlNanSubscribeRequestToLegacy: passphrase_len too small";
      return false;
    }
    if (legacy_request->key_info.body.passphrase_info.passphrase_len
            > NAN_SECURITY_MIN_PASSPHRASE_LEN) {
      LOG(ERROR) << "convertHidlNanSubscribeRequestToLegacy: passphrase_len too large";
      return false;
    }
    memcpy(legacy_request->key_info.body.passphrase_info.passphrase,
          hidl_request.baseConfigs.securityConfig.passphrase.data(),
          legacy_request->key_info.body.passphrase_info.passphrase_len);
  }
  legacy_request->sdea_params.security_cfg = (hidl_request.baseConfigs.securityConfig.securityType
          != NanDataPathSecurityType::OPEN) ? legacy_hal::NAN_DP_CONFIG_SECURITY
              : legacy_hal::NAN_DP_CONFIG_NO_SECURITY;
  legacy_request->sdea_params.ranging_state = hidl_request.baseConfigs.rangingRequired ?
        legacy_hal::NAN_RANGING_ENABLE : legacy_hal::NAN_RANGING_DISABLE;
  legacy_request->ranging_cfg.ranging_interval_msec = hidl_request.baseConfigs.rangingIntervalMsec;
@@ -1251,8 +1298,9 @@ bool convertHidlNanDataPathInitiatorRequestToLegacy(
        (legacy_hal::NanDataPathChannelCfg) hidl_request.channelRequestType;
  legacy_request->channel = hidl_request.channel;
  strcpy(legacy_request->ndp_iface, hidl_request.ifaceName.c_str());
  legacy_request->ndp_cfg.security_cfg = hidl_request.securityRequired ?
        legacy_hal::NAN_DP_CONFIG_SECURITY : legacy_hal::NAN_DP_CONFIG_NO_SECURITY;
  legacy_request->ndp_cfg.security_cfg = (hidl_request.securityConfig.securityType
        != NanDataPathSecurityType::OPEN) ? legacy_hal::NAN_DP_CONFIG_SECURITY
            : legacy_hal::NAN_DP_CONFIG_NO_SECURITY;
  legacy_request->app_info.ndp_app_info_len = hidl_request.appInfo.size();
  if (legacy_request->app_info.ndp_app_info_len > NAN_DP_MAX_APP_INFO_LEN) {
    LOG(ERROR) << "convertHidlNanDataPathInitiatorRequestToLegacy: ndp_app_info_len too large";
@@ -1260,13 +1308,43 @@ bool convertHidlNanDataPathInitiatorRequestToLegacy(
  }
  memcpy(legacy_request->app_info.ndp_app_info, hidl_request.appInfo.data(),
        legacy_request->app_info.ndp_app_info_len);
  legacy_request->cipher_type = (unsigned int) hidl_request.cipherType;
  legacy_request->pmk_len = hidl_request.pmk.size();
  if (legacy_request->pmk_len > NAN_PMK_INFO_LEN) {
  legacy_request->cipher_type = (unsigned int) hidl_request.securityConfig.cipherType;
  if (hidl_request.securityConfig.securityType == NanDataPathSecurityType::PMK) {
    legacy_request->key_info.key_type = legacy_hal::NAN_SECURITY_KEY_INPUT_PMK;
    legacy_request->key_info.body.pmk_info.pmk_len = hidl_request.securityConfig.pmk.size();
    if (legacy_request->key_info.body.pmk_info.pmk_len > NAN_PMK_INFO_LEN) {
      LOG(ERROR) << "convertHidlNanDataPathInitiatorRequestToLegacy: pmk_len too large";
      return false;
    }
  memcpy(legacy_request->pmk, hidl_request.pmk.data(), legacy_request->pmk_len);
    memcpy(legacy_request->key_info.body.pmk_info.pmk,
          hidl_request.securityConfig.pmk.data(),
          legacy_request->key_info.body.pmk_info.pmk_len);
  }
  if (hidl_request.securityConfig.securityType == NanDataPathSecurityType::PASSPHRASE) {
    legacy_request->key_info.key_type = legacy_hal::NAN_SECURITY_KEY_INPUT_PASSPHRASE;
    legacy_request->key_info.body.passphrase_info.passphrase_len =
        hidl_request.securityConfig.passphrase.size();
    if (legacy_request->key_info.body.passphrase_info.passphrase_len
            < NAN_SECURITY_MIN_PASSPHRASE_LEN) {
      LOG(ERROR) << "convertHidlNanDataPathInitiatorRequestToLegacy: passphrase_len too small";
      return false;
    }
    if (legacy_request->key_info.body.passphrase_info.passphrase_len
            > NAN_SECURITY_MIN_PASSPHRASE_LEN) {
      LOG(ERROR) << "convertHidlNanDataPathInitiatorRequestToLegacy: passphrase_len too large";
      return false;
    }
    memcpy(legacy_request->key_info.body.passphrase_info.passphrase,
          hidl_request.securityConfig.passphrase.data(),
          legacy_request->key_info.body.passphrase_info.passphrase_len);
  }
  legacy_request->service_name_len = hidl_request.serviceNameOutOfBand.size();
  if (legacy_request->service_name_len > NAN_MAX_SERVICE_NAME_LEN) {
    LOG(ERROR) << "convertHidlNanDataPathInitiatorRequestToLegacy: service_name_len too large";
    return false;
  }
  memcpy(legacy_request->service_name, hidl_request.serviceNameOutOfBand.data(),
        legacy_request->service_name_len);

  return true;
}
@@ -1284,8 +1362,9 @@ bool convertHidlNanDataPathIndicationResponseToLegacy(
        legacy_hal::NAN_DP_REQUEST_ACCEPT : legacy_hal::NAN_DP_REQUEST_REJECT;
  legacy_request->ndp_instance_id = hidl_request.ndpInstanceId;
  strcpy(legacy_request->ndp_iface, hidl_request.ifaceName.c_str());
  legacy_request->ndp_cfg.security_cfg = hidl_request.securityRequired ?
        legacy_hal::NAN_DP_CONFIG_SECURITY : legacy_hal::NAN_DP_CONFIG_NO_SECURITY;
  legacy_request->ndp_cfg.security_cfg = (hidl_request.securityConfig.securityType
        != NanDataPathSecurityType::OPEN) ? legacy_hal::NAN_DP_CONFIG_SECURITY
            : legacy_hal::NAN_DP_CONFIG_NO_SECURITY;
  legacy_request->app_info.ndp_app_info_len = hidl_request.appInfo.size();
  if (legacy_request->app_info.ndp_app_info_len > NAN_DP_MAX_APP_INFO_LEN) {
    LOG(ERROR) << "convertHidlNanDataPathIndicationResponseToLegacy: ndp_app_info_len too large";
@@ -1293,13 +1372,43 @@ bool convertHidlNanDataPathIndicationResponseToLegacy(
  }
  memcpy(legacy_request->app_info.ndp_app_info, hidl_request.appInfo.data(),
        legacy_request->app_info.ndp_app_info_len);
  legacy_request->cipher_type = (unsigned int) hidl_request.cipherType;
  legacy_request->pmk_len = hidl_request.pmk.size();
  if (legacy_request->pmk_len > NAN_PMK_INFO_LEN) {
  legacy_request->cipher_type = (unsigned int) hidl_request.securityConfig.cipherType;
  if (hidl_request.securityConfig.securityType == NanDataPathSecurityType::PMK) {
    legacy_request->key_info.key_type = legacy_hal::NAN_SECURITY_KEY_INPUT_PMK;
    legacy_request->key_info.body.pmk_info.pmk_len = hidl_request.securityConfig.pmk.size();
    if (legacy_request->key_info.body.pmk_info.pmk_len > NAN_PMK_INFO_LEN) {
      LOG(ERROR) << "convertHidlNanDataPathIndicationResponseToLegacy: pmk_len too large";
      return false;
    }
  memcpy(legacy_request->pmk, hidl_request.pmk.data(), legacy_request->pmk_len);
    memcpy(legacy_request->key_info.body.pmk_info.pmk,
          hidl_request.securityConfig.pmk.data(),
          legacy_request->key_info.body.pmk_info.pmk_len);
  }
  if (hidl_request.securityConfig.securityType == NanDataPathSecurityType::PASSPHRASE) {
    legacy_request->key_info.key_type = legacy_hal::NAN_SECURITY_KEY_INPUT_PASSPHRASE;
    legacy_request->key_info.body.passphrase_info.passphrase_len =
        hidl_request.securityConfig.passphrase.size();
    if (legacy_request->key_info.body.passphrase_info.passphrase_len
            < NAN_SECURITY_MIN_PASSPHRASE_LEN) {
      LOG(ERROR) << "convertHidlNanDataPathIndicationResponseToLegacy: passphrase_len too small";
      return false;
    }
    if (legacy_request->key_info.body.passphrase_info.passphrase_len
            > NAN_SECURITY_MIN_PASSPHRASE_LEN) {
      LOG(ERROR) << "convertHidlNanDataPathIndicationResponseToLegacy: passphrase_len too large";
      return false;
    }
    memcpy(legacy_request->key_info.body.passphrase_info.passphrase,
          hidl_request.securityConfig.passphrase.data(),
          legacy_request->key_info.body.passphrase_info.passphrase_len);
  }
  legacy_request->service_name_len = hidl_request.serviceNameOutOfBand.size();
  if (legacy_request->service_name_len > NAN_MAX_SERVICE_NAME_LEN) {
    LOG(ERROR) << "convertHidlNanDataPathIndicationResponseToLegacy: service_name_len too large";
    return false;
  }
  memcpy(legacy_request->service_name, hidl_request.serviceNameOutOfBand.data(),
        legacy_request->service_name_len);

  return true;
}
+72 −43
Original line number Diff line number Diff line
@@ -585,6 +585,17 @@ enum StaRoamingState : uint8_t {
 * Networking (NAN) Technical Specification".
 */

/**
 * Size limits for parameters used in the NAN interface.
 */
enum NanParamSizeLimits : uint32_t {
  /* Minimum length of Passphrase argument for data-path configuration */
  MIN_PASSPHRASE_LENGTH = 8,

  /* Maximum length of Passphrase argument for data-path configuration */
  MAX_PASSPHRASE_LENGTH = 63,
};

/**
 * A unique short handle provided by the client to identify individual invocations of
 * certain API's like |IWifiNanIface.*|.
@@ -700,6 +711,15 @@ enum NanDataPathChannelCfg : uint32_t {
                             // cannot honor the request then the data-path request is rejected.
};

/**
 * NAN DP (data-path) security configuration options.
 */
enum NanDataPathSecurityType : uint32_t {
  OPEN,       // no security
  PMK,        // security: PMK
  PASSPHRASE, // security: passphrase
};

/**
 * NAN band-specific configuration.
 */
@@ -909,6 +929,38 @@ enum NanRangingIndication : uint32_t {
  EGRESS_MET_MASK = 1 << 2             // trigger event only when egress conditions met
};

/**
 * Configuration of NAN data-path security.
 */
struct NanDataPathSecurityConfig {
  /**
   * Security configuration of the data-path (NDP). Security is required if not equal to
   * |NanDataPathSecurityType.OPEN|.
   * NAN Spec: Service Discovery Extension Attribute (SDEA) / Control / Security Required
   */
  NanDataPathSecurityType securityType;
  /**
   * Cipher type for data-paths. If |securityType| is |NanDataPathSecurityType.OPEN| then must
   * be set to |NanCipherSuiteType.NONE|, otherwise a non-|NanCipherSuiteType.NONE| cipher suite
   * must be specified.
   */
  NanCipherSuiteType cipherType;
  /**
   * Optional Pairwise Master Key (PMK). Must be specified (and is only used) if |securityType| is
   * set to |NanDataPathSecurityType.PMK|.
   * Ref: IEEE 802.11i
   */
  uint8_t[32] pmk;
  /**
   * Optional Passphrase. Must be specified (and is only used) if |securityType| is set to
   * |NanDataPathSecurityType.PASSPHRASE|.
   * Min length: |MIN_PASSPHRASE_LENGTH|
   * Max length: |MAX_PASSPHRASE_LENGTH|
   * NAN Spec: Appendix: Mapping pass-phrase to PMK for NCS-SK Cipher Suites
   */
  vec<uint8_t> passphrase;
};

/**
 * Configurations of NAN discovery sessions: common to publish and subscribe discovery.
 */
@@ -1009,25 +1061,11 @@ struct NanDiscoveryCommonConfig {
   */
  bool disableFollowupReceivedIndication;
  /**
   * Cipher type for data-paths constructed in the context of this discovery session. Must be
   * specified as |NanCipherSuiteType.NONE| if no |pmk| is provided.
   * Security configuration of data-paths created in the context of this discovery session. Security
   * parameters can be overridden during the actual construction of the data-path - allowing
   * individual data-paths to have unique PMKs or Passphrases.
   */
  NanCipherSuiteType cipherType;
  /**
   * Optional Pairwise Master Key (PMK) for data-paths constructed in the context of this discovery
   * session. A PMK can also be provided during the actual construction of the data-path (which
   * allows for unique PMKs for each data-path). The |cipherType| must be specified if a PMK is
   * provided.
   * Max length: 32
   * Ref: IEEE 802.11i
   */
  vec<uint8_t> pmk;
  /**
   * Specifies whether or not security is enabled in any data-path (NDP) constructed in the context
   * of this discovery session.
   * NAN Spec: Service Discovery Extension Attribute (SDEA) / Control / Security Required
   */
  bool securityEnabledInNdp;
  NanDataPathSecurityConfig securityConfig;
  /**
   * Specifies whether or not there is a ranging requirement in this discovery session.
   * Ranging is only performed if all other match criteria with the peer are met. Ranging must
@@ -1213,10 +1251,9 @@ struct NanInitiateDataPathRequest {
   */
  string ifaceName;
  /**
   * Specifies whether or not security is required for the data-path being created.
   * NAN Spec: Data Path Attributes / NDP Attribute / NDP Control / Security Present
   * Security configuration of the requested data-path.
   */
  bool securityRequired;
  NanDataPathSecurityConfig securityConfig;
  /**
   * Arbitrary information communicated to the peer as part of the data-path setup process - there
   * is no semantic meaning to these bytes. They are passed-through from sender to receiver as-is
@@ -1226,17 +1263,13 @@ struct NanInitiateDataPathRequest {
   */
  vec<uint8_t> appInfo;
  /**
   * Cipher type for the data-path being requested. Must be specified as |NanCipherSuiteType.NONE|
   * if no |pmk| is provided.
   */
  NanCipherSuiteType cipherType;
  /**
   * Pairwise Master Key (PMK) for the data-path being requested (if |securityRequired| is true).
   * The |cipherType| must be specified if a PMK is provided.
   * Max length: 32
   * Ref: IEEE 802.11i
   * A service name to be used with |passphrase| to construct a Pairwise Master Key (PMK) for the
   * data-path. Only relevant when a data-path is requested which is not associated with a NAN
   * discovery session - e.g. using out-of-band discovery.
   * Constraints: same as |NanDiscoveryCommonConfig.serviceName|
   * NAN Spec: Appendix: Mapping pass-phrase to PMK for NCS-SK Cipher Suites
   */
  vec<uint8_t> pmk;
  vec<uint8_t> serviceNameOutOfBand;
};

/**
@@ -1259,10 +1292,9 @@ struct NanRespondToDataPathIndicationRequest {
   */
  string ifaceName;
  /**
   * Specifies whether or not security is required for the data-path being created.
   * NAN Spec: Data Path Attributes / NDP Attribute / NDP Control / Security Present
   * Security configuration of the requested data-path.
   */
  bool securityRequired;
  NanDataPathSecurityConfig securityConfig;
  /**
   * Arbitrary information communicated to the peer as part of the data-path setup process - there
   * is no semantic meaning to these bytes. They are passed-through from sender to receiver as-is
@@ -1272,16 +1304,13 @@ struct NanRespondToDataPathIndicationRequest {
   */
  vec<uint8_t> appInfo;
  /**
   * Cipher type for the data-path being negotiated. Must be specified as |NanCipherSuiteType.NONE|
   * if no |pmk| is provided.
   */
  NanCipherSuiteType cipherType;
  /**
   * Pairwise Master Key (PMK) for the data-path being negotiated (if |securityRequired| is true).
   * The |cipherType| must be specified if a PMK is provided.
   * Max length: 32
   * A service name to be used with |passphrase| to construct a Pairwise Master Key (PMK) for the
   * data-path. Only relevant when a data-path is requested which is not associated with a NAN
   * discovery session - e.g. using out-of-band discovery.
   * Constraints: same as |NanDiscoveryCommonConfig.serviceName|
   * NAN Spec: Appendix: Mapping pass-phrase to PMK for NCS-SK Cipher Suites
   */
  vec<uint8_t> pmk;
  vec<uint8_t> serviceNameOutOfBand;
};

/**