1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <VtsCoreUtil.h>
18 #include <android/hardware/wifi/1.1/IWifi.h>
19 #include <android/hardware/wifi/supplicant/1.1/ISupplicant.h>
20 #include <android/hardware/wifi/supplicant/1.2/types.h>
21 #include <android/hardware/wifi/supplicant/1.3/ISupplicant.h>
22 #include <android/hardware/wifi/supplicant/1.3/ISupplicantStaNetwork.h>
23 #include <android/hardware/wifi/supplicant/1.3/types.h>
24 #include <android/hardware/wifi/supplicant/1.4/ISupplicant.h>
25 #include <android/hardware/wifi/supplicant/1.4/ISupplicantStaIface.h>
26 #include <android/hardware/wifi/supplicant/1.4/ISupplicantStaIfaceCallback.h>
27 #include <android/hardware/wifi/supplicant/1.4/types.h>
28 #include <gtest/gtest.h>
29 #include <hidl/GtestPrinter.h>
30 #include <hidl/HidlSupport.h>
31 #include <hidl/ServiceManagement.h>
32 
33 #include "supplicant_hidl_test_utils.h"
34 #include "supplicant_hidl_test_utils_1_4.h"
35 
36 using ::android::sp;
37 using ::android::hardware::hidl_array;
38 using ::android::hardware::hidl_string;
39 using ::android::hardware::hidl_vec;
40 using ::android::hardware::Return;
41 using ::android::hardware::Void;
42 using ::android::hardware::wifi::supplicant::V1_0::SupplicantStatus;
43 using ::android::hardware::wifi::supplicant::V1_0::SupplicantStatusCode;
44 using ::android::hardware::wifi::supplicant::V1_2::DppAkm;
45 using ::android::hardware::wifi::supplicant::V1_2::DppFailureCode;
46 using ::android::hardware::wifi::supplicant::V1_2::DppNetRole;
47 using ::android::hardware::wifi::supplicant::V1_2::DppProgressCode;
48 using ::android::hardware::wifi::supplicant::V1_3::DppSuccessCode;
49 using ::android::hardware::wifi::supplicant::V1_3::ISupplicantStaNetwork;
50 using ::android::hardware::wifi::supplicant::V1_4::ConnectionCapabilities;
51 using ::android::hardware::wifi::supplicant::V1_4::DppCurve;
52 using ::android::hardware::wifi::supplicant::V1_4::DppResponderBootstrapInfo;
53 using ::android::hardware::wifi::supplicant::V1_4::ISupplicant;
54 using ::android::hardware::wifi::supplicant::V1_4::ISupplicantStaIface;
55 using ::android::hardware::wifi::supplicant::V1_4::ISupplicantStaIfaceCallback;
56 
57 namespace {
58 constexpr uint8_t kTestMacAddr[] = {0x56, 0x67, 0x67, 0xf4, 0x56, 0x92};
59 }  // namespace
60 
61 using SupplicantStatusV1_4 =
62     ::android::hardware::wifi::supplicant::V1_4::SupplicantStatus;
63 using SupplicantStatusCodeV1_4 =
64     ::android::hardware::wifi::supplicant::V1_4::SupplicantStatusCode;
65 
66 class SupplicantStaIfaceHidlTest : public SupplicantHidlTestBaseV1_4 {
67    public:
SetUp()68     virtual void SetUp() override {
69         SupplicantHidlTestBaseV1_4::SetUp();
70         sta_iface_ = getSupplicantStaIface_1_4(supplicant_);
71         ASSERT_NE(sta_iface_.get(), nullptr);
72 
73         memcpy(mac_addr_.data(), kTestMacAddr, mac_addr_.size());
74     }
75 
76    protected:
77     // ISupplicantStaIface object used for all tests in this fixture.
78     sp<ISupplicantStaIface> sta_iface_;
79     // MAC address to use for various tests.
80     std::array<uint8_t, 6> mac_addr_;
81 
isDppSupported()82     bool isDppSupported() {
83         uint32_t keyMgmtMask = 0;
84 
85         // We need to first get the key management capabilities from the device.
86         // If DPP is not supported, we just pass the test.
87         sta_iface_->getKeyMgmtCapabilities_1_3(
88             [&](const SupplicantStatus& status, uint32_t keyMgmtMaskInternal) {
89                 EXPECT_EQ(SupplicantStatusCode::SUCCESS, status.code);
90                 keyMgmtMask = keyMgmtMaskInternal;
91             });
92 
93         if (!(keyMgmtMask & ISupplicantStaNetwork::KeyMgmtMask::DPP)) {
94             // DPP not supported
95             return false;
96         }
97         return true;
98     }
99 };
100 
101 class IfaceCallback : public ISupplicantStaIfaceCallback {
onNetworkAdded(uint32_t)102     Return<void> onNetworkAdded(uint32_t /* id */) override { return Void(); }
onNetworkRemoved(uint32_t)103     Return<void> onNetworkRemoved(uint32_t /* id */) override { return Void(); }
onStateChanged(ISupplicantStaIfaceCallback::State,const hidl_array<uint8_t,6> &,uint32_t,const hidl_vec<uint8_t> &)104     Return<void> onStateChanged(
105         ISupplicantStaIfaceCallback::State /* newState */,
106         const hidl_array<uint8_t, 6>& /*bssid */, uint32_t /* id */,
107         const hidl_vec<uint8_t>& /* ssid */) override {
108         return Void();
109     }
onAnqpQueryDone(const hidl_array<uint8_t,6> &,const::android::hardware::wifi::supplicant::V1_0::ISupplicantStaIfaceCallback::AnqpData &,const ISupplicantStaIfaceCallback::Hs20AnqpData &)110     Return<void> onAnqpQueryDone(
111         const hidl_array<uint8_t, 6>& /* bssid */,
112         const ::android::hardware::wifi::supplicant::V1_0::
113             ISupplicantStaIfaceCallback::AnqpData& /* data */,
114         const ISupplicantStaIfaceCallback::Hs20AnqpData& /* hs20Data */)
115         override {
116         return Void();
117     }
onHs20IconQueryDone(const hidl_array<uint8_t,6> &,const hidl_string &,const hidl_vec<uint8_t> &)118     virtual Return<void> onHs20IconQueryDone(
119         const hidl_array<uint8_t, 6>& /* bssid */,
120         const hidl_string& /* fileName */,
121         const hidl_vec<uint8_t>& /* data */) override {
122         return Void();
123     }
onHs20SubscriptionRemediation(const hidl_array<uint8_t,6> &,ISupplicantStaIfaceCallback::OsuMethod,const hidl_string &)124     virtual Return<void> onHs20SubscriptionRemediation(
125         const hidl_array<uint8_t, 6>& /* bssid */,
126         ISupplicantStaIfaceCallback::OsuMethod /* osuMethod */,
127         const hidl_string& /* url*/) override {
128         return Void();
129     }
onHs20TermsAndConditionsAcceptanceRequestedNotification(const hidl_array<uint8_t,6> &,const hidl_string &)130     Return<void> onHs20TermsAndConditionsAcceptanceRequestedNotification(
131         const hidl_array<uint8_t, 6>& /* bssid */,
132         const hidl_string& /* url */) override {
133         return Void();
134     }
onHs20DeauthImminentNotice(const hidl_array<uint8_t,6> &,uint32_t,uint32_t,const hidl_string &)135     Return<void> onHs20DeauthImminentNotice(
136         const hidl_array<uint8_t, 6>& /* bssid */, uint32_t /* reasonCode */,
137         uint32_t /* reAuthDelayInSec */,
138         const hidl_string& /* url */) override {
139         return Void();
140     }
onDisconnected(const hidl_array<uint8_t,6> &,bool,ISupplicantStaIfaceCallback::ReasonCode)141     Return<void> onDisconnected(const hidl_array<uint8_t, 6>& /* bssid */,
142                                 bool /* locallyGenerated */,
143                                 ISupplicantStaIfaceCallback::ReasonCode
144                                 /* reasonCode */) override {
145         return Void();
146     }
onAssociationRejected(const hidl_array<uint8_t,6> &,ISupplicantStaIfaceCallback::StatusCode,bool)147     Return<void> onAssociationRejected(
148         const hidl_array<uint8_t, 6>& /* bssid */,
149         ISupplicantStaIfaceCallback::StatusCode /* statusCode */,
150         bool /*timedOut */) override {
151         return Void();
152     }
onAuthenticationTimeout(const hidl_array<uint8_t,6> &)153     Return<void> onAuthenticationTimeout(
154         const hidl_array<uint8_t, 6>& /* bssid */) override {
155         return Void();
156     }
onBssidChanged(ISupplicantStaIfaceCallback::BssidChangeReason,const hidl_array<uint8_t,6> &)157     Return<void> onBssidChanged(
158         ISupplicantStaIfaceCallback::BssidChangeReason /* reason */,
159         const hidl_array<uint8_t, 6>& /* bssid */) override {
160         return Void();
161     }
onEapFailure()162     Return<void> onEapFailure() override { return Void(); }
onEapFailure_1_1(ISupplicantStaIfaceCallback::EapErrorCode)163     Return<void> onEapFailure_1_1(
164         ISupplicantStaIfaceCallback::EapErrorCode /* eapErrorCode */) override {
165         return Void();
166     }
onEapFailure_1_3(uint32_t)167     Return<void> onEapFailure_1_3(uint32_t /* eapErrorCode */) override {
168         return Void();
169     }
onWpsEventSuccess()170     Return<void> onWpsEventSuccess() override { return Void(); }
onWpsEventFail(const hidl_array<uint8_t,6> &,ISupplicantStaIfaceCallback::WpsConfigError,ISupplicantStaIfaceCallback::WpsErrorIndication)171     Return<void> onWpsEventFail(
172         const hidl_array<uint8_t, 6>& /* bssid */,
173         ISupplicantStaIfaceCallback::WpsConfigError /* configError */,
174         ISupplicantStaIfaceCallback::WpsErrorIndication /* errorInd */)
175         override {
176         return Void();
177     }
onWpsEventPbcOverlap()178     Return<void> onWpsEventPbcOverlap() override { return Void(); }
onExtRadioWorkStart(uint32_t)179     Return<void> onExtRadioWorkStart(uint32_t /* id */) override {
180         return Void();
181     }
onExtRadioWorkTimeout(uint32_t)182     Return<void> onExtRadioWorkTimeout(uint32_t /* id*/) override {
183         return Void();
184     }
onDppSuccessConfigReceived(const hidl_vec<uint8_t> &,const hidl_string &,const hidl_array<uint8_t,32> &,DppAkm)185     Return<void> onDppSuccessConfigReceived(
186         const hidl_vec<uint8_t>& /* ssid */, const hidl_string& /* password */,
187         const hidl_array<uint8_t, 32>& /* psk */,
188         DppAkm /* securityAkm */) override {
189         return Void();
190     }
onDppSuccessConfigSent()191     Return<void> onDppSuccessConfigSent() override { return Void(); }
onDppProgress(DppProgressCode)192     Return<void> onDppProgress(DppProgressCode /* code */) override {
193         return Void();
194     }
onDppFailure(DppFailureCode)195     Return<void> onDppFailure(DppFailureCode /* code */) override {
196         return Void();
197     }
onDppSuccess(DppSuccessCode)198     Return<void> onDppSuccess(DppSuccessCode /* code */) override {
199         return Void();
200     }
onDppProgress_1_3(::android::hardware::wifi::supplicant::V1_3::DppProgressCode)201     Return<void> onDppProgress_1_3(
202         ::android::hardware::wifi::supplicant::V1_3::DppProgressCode /* code */)
203         override {
204         return Void();
205     }
onDppFailure_1_3(::android::hardware::wifi::supplicant::V1_3::DppFailureCode,const hidl_string &,const hidl_string &,const hidl_vec<uint16_t> &)206     Return<void> onDppFailure_1_3(
207         ::android::hardware::wifi::supplicant::V1_3::DppFailureCode /* code */,
208         const hidl_string& /* ssid */, const hidl_string& /* channelList */,
209         const hidl_vec<uint16_t>& /* bandList */) override {
210         return Void();
211     }
onPmkCacheAdded(int64_t,const hidl_vec<uint8_t> &)212     Return<void> onPmkCacheAdded(
213         int64_t /* expirationTimeInSec */,
214         const hidl_vec<uint8_t>& /* serializedEntry */) override {
215         return Void();
216     }
onBssTmHandlingDone(const ISupplicantStaIfaceCallback::BssTmData &)217     Return<void> onBssTmHandlingDone(
218         const ISupplicantStaIfaceCallback::BssTmData& /* data */) override {
219         return Void();
220     }
onStateChanged_1_3(ISupplicantStaIfaceCallback::State,const hidl_array<uint8_t,6> &,uint32_t,const hidl_vec<uint8_t> &,bool)221     Return<void> onStateChanged_1_3(
222         ISupplicantStaIfaceCallback::State /* newState */,
223         const hidl_array<uint8_t, 6>& /*bssid */, uint32_t /* id */,
224         const hidl_vec<uint8_t>& /* ssid */, bool /* filsHlpSent */) override {
225         return Void();
226     }
onAnqpQueryDone_1_4(const hidl_array<uint8_t,6> &,const::android::hardware::wifi::supplicant::V1_4::ISupplicantStaIfaceCallback::AnqpData &,const ISupplicantStaIfaceCallback::Hs20AnqpData &)227     Return<void> onAnqpQueryDone_1_4(
228         const hidl_array<uint8_t, 6>& /* bssid */,
229         const ::android::hardware::wifi::supplicant::V1_4::
230             ISupplicantStaIfaceCallback::AnqpData& /* data */,
231         const ISupplicantStaIfaceCallback::Hs20AnqpData& /* hs20Data */)
232         override {
233         return Void();
234     }
onAssociationRejected_1_4(const ISupplicantStaIfaceCallback::AssociationRejectionData &)235     Return<void> onAssociationRejected_1_4(
236         const ISupplicantStaIfaceCallback::AssociationRejectionData& /* data */)
237         override {
238         return Void();
239     }
onNetworkNotFound(const hidl_vec<uint8_t> &)240     Return<void> onNetworkNotFound(
241         const hidl_vec<uint8_t>& /* ssid */) override {
242         return Void();
243     }
244 };
245 
246 /*
247  * getConnectionCapabilities_1_4
248  */
TEST_P(SupplicantStaIfaceHidlTest,GetConnectionCapabilities)249 TEST_P(SupplicantStaIfaceHidlTest, GetConnectionCapabilities) {
250     sta_iface_->getConnectionCapabilities_1_4(
251         [&](const SupplicantStatusV1_4& status,
252             ConnectionCapabilities /* capabilities */) {
253             EXPECT_EQ(SupplicantStatusCodeV1_4::SUCCESS, status.code);
254         });
255 }
256 
257 /*
258  * RegisterCallback_1_4
259  */
TEST_P(SupplicantStaIfaceHidlTest,RegisterCallback_1_4)260 TEST_P(SupplicantStaIfaceHidlTest, RegisterCallback_1_4) {
261     sta_iface_->registerCallback_1_4(
262         new IfaceCallback(), [](const SupplicantStatusV1_4& status) {
263             EXPECT_EQ(SupplicantStatusCodeV1_4::SUCCESS, status.code);
264         });
265 }
266 
267 /*
268  * InitiateVenueUrlAnqpQuery.
269  */
TEST_P(SupplicantStaIfaceHidlTest,InitiateVenueUrlAnqpQuery)270 TEST_P(SupplicantStaIfaceHidlTest, InitiateVenueUrlAnqpQuery) {
271     sta_iface_->initiateVenueUrlAnqpQuery(
272         mac_addr_, [](const SupplicantStatusV1_4& status) {
273             // These requests will fail unless the BSSID mentioned is actually
274             // present in scan results.
275             EXPECT_EQ(SupplicantStatusCodeV1_4::FAILURE_UNKNOWN, status.code);
276         });
277 }
278 
279 /*
280  * GetWpaDriverCapabilities
281  */
TEST_P(SupplicantStaIfaceHidlTest,GetWpaDriverCapabilities)282 TEST_P(SupplicantStaIfaceHidlTest, GetWpaDriverCapabilities) {
283     sta_iface_->getWpaDriverCapabilities_1_4(
284         [&](const SupplicantStatusV1_4& status, uint32_t) {
285             EXPECT_EQ(SupplicantStatusCodeV1_4::SUCCESS, status.code);
286         });
287 }
288 
289 /*
290  * StartDppEnrolleeResponder
291  */
TEST_P(SupplicantStaIfaceHidlTest,StartDppEnrolleeResponder)292 TEST_P(SupplicantStaIfaceHidlTest, StartDppEnrolleeResponder) {
293     // We need to first get the key management capabilities from the device.
294     // If DPP is not supported, we just pass the test.
295     if (!isDppSupported()) {
296         // DPP not supported
297         return;
298     }
299 
300     hidl_string deviceInfo = "DPP_Responder_Mode_VTS_Test";
301     uint32_t bootstrap_id = 0;
302     uint32_t listen_channel = 0;
303     uint8_t mac_address[6] = {0x22, 0x33, 0x44, 0x55, 0x66, 0x77};
304 
305     // Generate DPP bootstrap information
306     sta_iface_->generateDppBootstrapInfoForResponder(
307         mac_address, deviceInfo, DppCurve::PRIME256V1,
308         [&](const SupplicantStatusV1_4& status,
309             DppResponderBootstrapInfo bootstrapInfo) {
310             EXPECT_EQ(SupplicantStatusCodeV1_4::SUCCESS, status.code);
311             EXPECT_NE(-1, bootstrapInfo.bootstrapId);
312             EXPECT_NE(0, bootstrapInfo.bootstrapId);
313             bootstrap_id = bootstrapInfo.bootstrapId;
314             listen_channel = bootstrapInfo.listenChannel;
315             EXPECT_NE(0, bootstrapInfo.listenChannel);
316         });
317 
318     // Start DPP as Enrollee-Responder.
319     sta_iface_->startDppEnrolleeResponder(
320         listen_channel, [&](const SupplicantStatusV1_4& status) {
321             EXPECT_EQ(SupplicantStatusCodeV1_4::SUCCESS, status.code);
322         });
323 
324     // Stop DPP Enrollee-Responder mode, ie remove the URI and stop listen.
325     sta_iface_->stopDppResponder(
326         bootstrap_id, [&](const SupplicantStatusV1_4& status) {
327             EXPECT_EQ(SupplicantStatusCodeV1_4::SUCCESS, status.code);
328         });
329 }
330 
331 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SupplicantStaIfaceHidlTest);
332 INSTANTIATE_TEST_CASE_P(
333     PerInstance, SupplicantStaIfaceHidlTest,
334     testing::Combine(
335         testing::ValuesIn(android::hardware::getAllHalInstanceNames(
336             android::hardware::wifi::V1_0::IWifi::descriptor)),
337         testing::ValuesIn(android::hardware::getAllHalInstanceNames(
338             android::hardware::wifi::supplicant::V1_4::ISupplicant::
339                 descriptor))),
340     android::hardware::PrintInstanceTupleNameToString<>);
341