Merge "Wifi: WAPI constants and methods"

This commit is contained in:
Jimmy Chen
2019-12-19 09:28:52 +00:00
committed by Android (Google) Code Review
5 changed files with 381 additions and 3 deletions

View File

@@ -653,9 +653,9 @@ cf1d55e8c68300090747ab90b94c22e4c859b29c84ced68a317c595bb115eab2 android.hardwar
36b3acf78ac4ecf8156be8741c1d8332cdce7a1ebf4dfa1562952f14a94e6c87 android.hardware.wifi.hostapd@1.2::IHostapd
2defa258951e25a132aaeb36e3febe6f41bf9c6dbb1b1ebdf0b41708ab4e107e android.hardware.wifi.hostapd@1.2::types
a64467bae843569f0d465c5be7f0c7a5b987985b55a3ef4794dd5afc68538650 android.hardware.wifi.supplicant@1.3::ISupplicant
44445b8a03d7b9e68b2fbd954672c18a8fce9e32851b0692f4f4ab3407f86ecb android.hardware.wifi.supplicant@1.3::ISupplicantStaIface
213457930af81ff3ea344fbc9d4a0d0a2bb70527f96b7b6a32ee3b5e4c17057e android.hardware.wifi.supplicant@1.3::ISupplicantStaIface
619fc9839ec6e369cfa9b28e3e9412e6885720ff8f9b5750c1b6ffb905120391 android.hardware.wifi.supplicant@1.3::ISupplicantStaIfaceCallback
c9273429fcf98d797d3bb07fdba6f1be95bf960f9255cde169fd1ca4db85f856 android.hardware.wifi.supplicant@1.3::ISupplicantStaNetwork
a6163000e2804472924733bcf8b4269db776460cc4df64f9c4dc8350d7aeafc5 android.hardware.wifi.supplicant@1.3::ISupplicantStaNetwork
9b0a3ab6f4f74b971ed094426d8a443e29b512ff03e1ab50c07156396cdb2483 android.hardware.wifi.supplicant@1.3::types
0e3c23f1c815469fdcdc39bc33a486817771c7c6b6e5303f2f25569499fc6c69 android.hardware.radio@1.5::types
2bc87cde08fcd8d9a0f5d4a2b8560ea793264d94f5b763a6b22d4a63d0f3cd5a android.hardware.radio@1.5::IRadio

View File

@@ -18,6 +18,7 @@ package android.hardware.wifi.supplicant@1.3;
import @1.0::SupplicantStatus;
import @1.2::ISupplicantStaIface;
import @1.3::ISupplicantStaNetwork;
import ISupplicantStaIfaceCallback;
/**
@@ -76,4 +77,17 @@ interface ISupplicantStaIface extends @1.2::ISupplicantStaIface {
* |SupplicantStatusCode.FAILURE_UNKNOWN|
*/
setMboCellularDataStatus(bool available) generates (SupplicantStatus status);
/**
* Get Key management capabilities of the device
*
* @return status Status of the operation, and a bitmap of key management mask.
* Possible status codes:
* |SupplicantStatusCode.SUCCESS|,
* |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
* |SupplicantStatusCode.FAILURE_NETWORK_INVALID|,
* |SupplicantStatusCode.FAILURE_UNKNOWN|
*/
getKeyMgmtCapabilities_1_3()
generates (SupplicantStatus status, bitfield<KeyMgmtMask> keyMgmtMask);
};

View File

@@ -16,6 +16,7 @@
package android.hardware.wifi.supplicant@1.3;
import @1.0::ISupplicantStaNetwork;
import @1.0::SupplicantStatus;
import @1.2::ISupplicantStaNetwork;
@@ -24,6 +25,32 @@ import @1.2::ISupplicantStaNetwork;
* configuration it controls.
*/
interface ISupplicantStaNetwork extends @1.2::ISupplicantStaNetwork {
/** Possble mask of values for Proto param. */
enum ProtoMask : @1.0::ISupplicantStaNetwork.ProtoMask {
WAPI = 1 << 2,
};
/** Possble mask of values for KeyMgmt param. */
enum KeyMgmtMask : @1.2::ISupplicantStaNetwork.KeyMgmtMask {
/* WAPI Psk */
WAPI_PSK = 1 << 12,
/** WAPI Cert */
WAPI_CERT = 1 << 13,
};
/** Possble mask of values for PairwiseCipher param. */
enum PairwiseCipherMask : @1.2::ISupplicantStaNetwork.PairwiseCipherMask {
/** SMS4 Pairwise Cipher */
SMS4 = 1 << 7,
};
/** Possble mask of values for GroupCipher param. */
enum GroupCipherMask : @1.2::ISupplicantStaNetwork.GroupCipherMask {
/** SMS4 Group Cipher */
SMS4 = 1 << 7,
};
/**
* Set OCSP (Online Certificate Status Protocol) type for this network.
*
@@ -48,6 +75,142 @@ interface ISupplicantStaNetwork extends @1.2::ISupplicantStaNetwork {
*/
getOcsp() generates (SupplicantStatus status, OcspType ocspType);
/**
* Set key management mask for the network.
*
* @param keyMgmtMask value to set.
* Combination of |KeyMgmtMask| values.
* @return status Status of the operation.
* Possible status codes:
* |SupplicantStatusCode.SUCCESS|,
* |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
* |SupplicantStatusCode.FAILURE_NETWORK_INVALID|,
* |SupplicantStatusCode.FAILURE_UNKNOWN|
*/
setKeyMgmt_1_3(bitfield<KeyMgmtMask> keyMgmtMask) generates (SupplicantStatus status);
/**
* Get the key mgmt mask set for the network.
*
* @return status Status of the operation.
* Possible status codes:
* |SupplicantStatusCode.SUCCESS|,
* |SupplicantStatusCode.FAILURE_NETWORK_INVALID|,
* |SupplicantStatusCode.FAILURE_UNKNOWN|
* @return keyMgmtMask Combination of |KeyMgmtMask| values.
*/
getKeyMgmt_1_3()
generates (SupplicantStatus status, bitfield<KeyMgmtMask> keyMgmtMask);
/**
* Set proto mask for the network.
*
* @param protoMask value to set.
* Combination of |ProtoMask| values.
* @return status Status of the operation.
* Possible status codes:
* |SupplicantStatusCode.SUCCESS|,
* |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
* |SupplicantStatusCode.FAILURE_NETWORK_INVALID|,
* |SupplicantStatusCode.FAILURE_UNKNOWN|
*/
setProto_1_3(bitfield<ProtoMask> protoMask) generates (SupplicantStatus status);
/**
* Get the proto mask set for the network.
*
* @return status Status of the operation.
* Possible status codes:
* |SupplicantStatusCode.SUCCESS|,
* |SupplicantStatusCode.FAILURE_NETWORK_INVALID|,
* |SupplicantStatusCode.FAILURE_UNKNOWN|
* @return protoMask Combination of |ProtoMask| values.
*/
getProto_1_3() generates (SupplicantStatus status, bitfield<ProtoMask> protoMask);
/**
* Set group cipher mask for the network.
*
* @param groupCipherMask value to set.
* Combination of |ProtoMask| values.
* @return status Status of the operation.
* Possible status codes:
* |SupplicantStatusCode.SUCCESS|,
* |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
* |SupplicantStatusCode.FAILURE_NETWORK_INVALID|,
* |SupplicantStatusCode.FAILURE_UNKNOWN|
*/
setGroupCipher_1_3(bitfield<GroupCipherMask> groupCipherMask)
generates (SupplicantStatus status);
/**
* Get the pairwise cipher mask set for the network.
*
* @return status Status of the operation.
* Possible status codes:
* |SupplicantStatusCode.SUCCESS|,
* |SupplicantStatusCode.FAILURE_NETWORK_INVALID|,
* |SupplicantStatusCode.FAILURE_UNKNOWN|
* @return pairwiseCipherMask Combination of |PairwiseCipherMask| values.
*/
getPairwiseCipher_1_3()
generates (SupplicantStatus status,
bitfield<PairwiseCipherMask> pairwiseCipherMask);
/**
* Set pairwise cipher mask for the network.
*
* @param pairwiseCipherMask value to set.
* Combination of |ProtoMask| values.
* @return status Status of the operation.
* Possible status codes:
* |SupplicantStatusCode.SUCCESS|,
* |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
* |SupplicantStatusCode.FAILURE_NETWORK_INVALID|,
* |SupplicantStatusCode.FAILURE_UNKNOWN|
*/
setPairwiseCipher_1_3(bitfield<PairwiseCipherMask> pairwiseCipherMask)
generates (SupplicantStatus status);
/**
* Get the group cipher mask set for the network.
*
* @return status Status of the operation.
* Possible status codes:
* |SupplicantStatusCode.SUCCESS|,
* |SupplicantStatusCode.FAILURE_NETWORK_INVALID|,
* |SupplicantStatusCode.FAILURE_UNKNOWN|
* @return groupCipherMask Combination of |GroupCipherMask| values.
*/
getGroupCipher_1_3()
generates (SupplicantStatus status,
bitfield<GroupCipherMask> groupCipherMask);
/**
* Set WAPI certificate suite for this network.
*
* @param suite value to set.
* @return status Status of the operation.
* Possible status codes:
* |SupplicantStatusCode.SUCCESS|,
* |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
* |SupplicantStatusCode.FAILURE_NETWORK_INVALID|,
* |SupplicantStatusCode.FAILURE_UNKNOWN|
*/
setWapiCertSuite(string suite) generates (SupplicantStatus status);
/**
* Get WAPI certificate suite set for this network.
*
* @return status Status of the operation.
* Possible status codes:
* |SupplicantStatusCode.SUCCESS|,
* |SupplicantStatusCode.FAILURE_NETWORK_INVALID|,
* |SupplicantStatusCode.FAILURE_UNKNOWN|
* @return suite The name of a suite.
*/
getWapiCertSuite() generates (SupplicantStatus status, string suite);
/**
* Add a PMK into supplicant PMK cache.
*

View File

@@ -227,3 +227,22 @@ TEST_F(SupplicantStaIfaceHidlTest, SetMboCellularDataStatus) {
EXPECT_EQ(expectedStatusCode, status.code);
});
}
/*
* GetKeyMgmtCapabilities_1_3
*/
TEST_F(SupplicantStaIfaceHidlTest, GetKeyMgmtCapabilities_1_3) {
sta_iface_->getKeyMgmtCapabilities_1_3([&](const SupplicantStatus& status,
uint32_t keyMgmtMask) {
if (SupplicantStatusCode::SUCCESS != status.code) {
// for unsupport case
EXPECT_EQ(SupplicantStatusCode::FAILURE_UNKNOWN, status.code);
} else {
// Even though capabilities vary, these two are always set in HAL
// v1.3
EXPECT_TRUE(keyMgmtMask & ISupplicantStaNetwork::KeyMgmtMask::NONE);
EXPECT_TRUE(keyMgmtMask &
ISupplicantStaNetwork::KeyMgmtMask::IEEE8021X);
}
});
}

View File

@@ -17,15 +17,18 @@
#include <android-base/logging.h>
#include <VtsHalHidlTargetTestBase.h>
#include <android/hardware/wifi/supplicant/1.3/ISupplicantStaIface.h>
#include <android/hardware/wifi/supplicant/1.3/ISupplicantStaNetwork.h>
#include "supplicant_hidl_test_utils.h"
#include "supplicant_hidl_test_utils_1_3.h"
using ::android::sp;
using ::android::hardware::hidl_string;
using ::android::hardware::hidl_vec;
using ::android::hardware::wifi::supplicant::V1_0::SupplicantStatus;
using ::android::hardware::wifi::supplicant::V1_0::SupplicantStatusCode;
using ::android::hardware::wifi::supplicant::V1_3::ISupplicantStaIface;
using ::android::hardware::wifi::supplicant::V1_3::ISupplicantStaNetwork;
using ::android::hardware::wifi::supplicant::V1_3::OcspType;
namespace {
@@ -39,15 +42,37 @@ class SupplicantStaNetworkHidlTest
virtual void SetUp() override {
startSupplicantAndWaitForHidlService();
EXPECT_TRUE(turnOnExcessiveLogging());
sta_iface_ = getSupplicantStaIface_1_3();
ASSERT_NE(nullptr, sta_iface_.get());
sta_network_ = createSupplicantStaNetwork_1_3();
ASSERT_NE(sta_network_.get(), nullptr);
ASSERT_NE(nullptr, sta_network_.get());
}
virtual void TearDown() override { stopSupplicant(); }
protected:
sp<ISupplicantStaIface> sta_iface_;
// ISupplicantStaNetwork object used for all tests in this fixture.
sp<ISupplicantStaNetwork> sta_network_;
bool isWapiSupported() {
uint32_t keyMgmtMask = 0;
// We need to first get the key management capabilities from the device.
// If WAPI is not supported, we just pass the test.
sta_iface_->getKeyMgmtCapabilities_1_3(
[&](const SupplicantStatus &status, uint32_t keyMgmtMaskInternal) {
EXPECT_EQ(SupplicantStatusCode::SUCCESS, status.code);
keyMgmtMask = keyMgmtMaskInternal;
});
if (!(keyMgmtMask & ISupplicantStaNetwork::KeyMgmtMask::WAPI_PSK)) {
// WAPI not supported
return false;
}
return true;
}
};
/*
@@ -84,3 +109,160 @@ TEST_F(SupplicantStaNetworkHidlTest, SetPmkCache) {
EXPECT_EQ(SupplicantStatusCode::SUCCESS, status.code);
});
}
/*
* SetGetKeyMgmt_1_3, check new WAPI proto support
*/
TEST_F(SupplicantStaNetworkHidlTest, SetGetKeyMgmt_1_3) {
uint32_t keyMgmt = (uint32_t)ISupplicantStaNetwork::KeyMgmtMask::WAPI_PSK;
sta_network_->setKeyMgmt_1_3(keyMgmt, [](const SupplicantStatus &status) {
if (SupplicantStatusCode::SUCCESS != status.code) {
// for unsupport case
EXPECT_EQ(SupplicantStatusCode::FAILURE_UNKNOWN, status.code);
}
});
sta_network_->getKeyMgmt_1_3(
[&keyMgmt](const SupplicantStatus &status, uint32_t keyMgmtOut) {
if (SupplicantStatusCode::SUCCESS != status.code) {
// for unsupport case
EXPECT_EQ(SupplicantStatusCode::FAILURE_UNKNOWN, status.code);
} else {
EXPECT_EQ(keyMgmtOut, keyMgmt);
}
});
keyMgmt = (uint32_t)ISupplicantStaNetwork::KeyMgmtMask::WAPI_CERT;
sta_network_->setKeyMgmt_1_3(keyMgmt, [](const SupplicantStatus &status) {
if (SupplicantStatusCode::SUCCESS != status.code) {
// for unsupport case
EXPECT_EQ(SupplicantStatusCode::FAILURE_UNKNOWN, status.code);
}
});
sta_network_->getKeyMgmt_1_3(
[&keyMgmt](const SupplicantStatus &status, uint32_t keyMgmtOut) {
if (SupplicantStatusCode::SUCCESS != status.code) {
// for unsupport case
EXPECT_EQ(SupplicantStatusCode::FAILURE_UNKNOWN, status.code);
} else {
EXPECT_EQ(keyMgmtOut, keyMgmt);
}
});
}
/*
* SetGetProto_1_3, check new WAPI proto support
*/
TEST_F(SupplicantStaNetworkHidlTest, SetGetProto_1_3) {
uint32_t wapiProto = (uint32_t)ISupplicantStaNetwork::ProtoMask::WAPI;
sta_network_->setProto(wapiProto, [](const SupplicantStatus &status) {
if (SupplicantStatusCode::SUCCESS != status.code) {
// for unsupport case
EXPECT_EQ(SupplicantStatusCode::FAILURE_UNKNOWN, status.code);
}
});
sta_network_->getProto([&](const SupplicantStatus &status, uint32_t proto) {
if (SupplicantStatusCode::SUCCESS != status.code) {
// for unsupport case
EXPECT_EQ(SupplicantStatusCode::FAILURE_UNKNOWN, status.code);
} else {
EXPECT_EQ(proto, wapiProto);
}
});
}
/*
* SetGetGroupCipher_1_3, check new WAPI support
*/
TEST_F(SupplicantStaNetworkHidlTest, SetGetGroupCipher_1_3) {
uint32_t groupCipher =
(uint32_t)ISupplicantStaNetwork::GroupCipherMask::SMS4;
sta_network_->setGroupCipher_1_3(
groupCipher, [](const SupplicantStatus &status) {
if (SupplicantStatusCode::SUCCESS != status.code) {
// for unsupport case
EXPECT_EQ(SupplicantStatusCode::FAILURE_UNKNOWN, status.code);
}
});
sta_network_->getGroupCipher_1_3(
[&groupCipher](const SupplicantStatus &status,
uint32_t groupCipherOut) {
if (SupplicantStatusCode::SUCCESS != status.code) {
// for unsupport case
EXPECT_EQ(SupplicantStatusCode::FAILURE_UNKNOWN, status.code);
} else {
EXPECT_EQ(groupCipherOut, groupCipher);
}
});
}
/*
* SetGetPairwiseCipher_1_3, check new WAPI support
*/
TEST_F(SupplicantStaNetworkHidlTest, SetGetPairwiseCipher_1_3) {
uint32_t pairwiseCipher =
(uint32_t)ISupplicantStaNetwork::PairwiseCipherMask::SMS4;
sta_network_->setPairwiseCipher_1_3(
pairwiseCipher, [](const SupplicantStatus &status) {
if (SupplicantStatusCode::SUCCESS != status.code) {
// for unsupport case
EXPECT_EQ(SupplicantStatusCode::FAILURE_UNKNOWN, status.code);
}
});
sta_network_->getPairwiseCipher_1_3(
[&pairwiseCipher](const SupplicantStatus &status,
uint32_t pairwiseCipherOut) {
if (SupplicantStatusCode::SUCCESS != status.code) {
// for unsupport case
EXPECT_EQ(SupplicantStatusCode::FAILURE_UNKNOWN, status.code);
} else {
EXPECT_EQ(pairwiseCipherOut, pairwiseCipher);
}
});
}
/*
* SetGetWapiCertSuite
*/
TEST_F(SupplicantStaNetworkHidlTest, SetGetWapiCertSuite) {
hidl_string testWapiCertSuite = "suite";
if (isWapiSupported()) {
sta_network_->setWapiCertSuite(
testWapiCertSuite, [](const SupplicantStatus &status) {
if (SupplicantStatusCode::SUCCESS != status.code) {
// for unsupport case
EXPECT_EQ(SupplicantStatusCode::FAILURE_UNKNOWN,
status.code);
}
});
sta_network_->getWapiCertSuite([testWapiCertSuite](
const SupplicantStatus &status,
const hidl_string &wapiCertSuite) {
if (SupplicantStatusCode::SUCCESS != status.code) {
// for unsupport case
EXPECT_EQ(SupplicantStatusCode::FAILURE_UNKNOWN, status.code);
} else {
EXPECT_EQ(testWapiCertSuite, wapiCertSuite);
}
});
} else {
sta_network_->setWapiCertSuite(
testWapiCertSuite, [](const SupplicantStatus &status) {
EXPECT_EQ(SupplicantStatusCode::FAILURE_UNKNOWN, status.code);
});
sta_network_->getWapiCertSuite(
[testWapiCertSuite](const SupplicantStatus &status,
const hidl_string &wapiCertSuite __unused) {
EXPECT_EQ(SupplicantStatusCode::FAILURE_UNKNOWN, status.code);
});
}
}