From 42463721c15a8ae3d11aee4493a7d5e5569bb72c Mon Sep 17 00:00:00 2001 From: Pankaj Garg Date: Wed, 15 Sep 2021 17:22:34 -0700 Subject: [PATCH] Move RendezvousServer and CommissionManager to a single class (#9709) * Move RendezvousServer and CommissionManager to a single class * fix compilation of tv app * address review comments * remove fabric deletion code from CommissioningWindowManager * fix build issue * fix test compilation --- examples/all-clusters-app/esp32/main/main.cpp | 9 +- examples/lighting-app/k32w/main/AppTask.cpp | 3 +- examples/lighting-app/mbed/CMakeLists.txt | 3 +- .../lighting-app/nrfconnect/main/AppTask.cpp | 2 +- examples/lighting-app/qpg/src/AppTask.cpp | 2 +- examples/lighting-app/telink/CMakeLists.txt | 3 +- .../lock-app/cc13x2x7_26x2x7/main/AppTask.cpp | 3 +- examples/lock-app/k32w/main/AppTask.cpp | 3 +- examples/lock-app/mbed/CMakeLists.txt | 3 +- examples/lock-app/nrfconnect/main/AppTask.cpp | 2 +- examples/lock-app/qpg/src/AppTask.cpp | 3 +- .../pump-app/cc13x2x7_26x2x7/main/AppTask.cpp | 3 +- examples/pump-app/nrfconnect/main/AppTask.cpp | 2 +- .../cc13x2x7_26x2x7/main/AppTask.cpp | 3 +- .../nrfconnect/main/AppTask.cpp | 2 +- examples/tv-casting-app/linux/main.cpp | 5 +- src/app/chip_data_model.cmake | 3 +- .../administrator-commissioning-server.cpp | 14 +- src/app/server/BUILD.gn | 6 +- src/app/server/CommissionManager.cpp | 177 ------------ src/app/server/CommissioningWindowManager.cpp | 267 ++++++++++++++++++ ...Manager.h => CommissioningWindowManager.h} | 41 ++- src/app/server/RendezvousServer.cpp | 183 ------------ src/app/server/RendezvousServer.h | 70 ----- src/app/server/Server.cpp | 12 +- src/app/server/Server.h | 15 +- src/app/tests/TestCommissionManager.cpp | 85 +++--- src/controller/CHIPDeviceController.cpp | 5 - src/controller/CHIPDeviceController.h | 23 -- .../secure_channel/RendezvousParameters.h | 27 -- 30 files changed, 378 insertions(+), 601 deletions(-) delete mode 100644 src/app/server/CommissionManager.cpp create mode 100644 src/app/server/CommissioningWindowManager.cpp rename src/app/server/{CommissionManager.h => CommissioningWindowManager.h} (60%) delete mode 100644 src/app/server/RendezvousServer.cpp delete mode 100644 src/app/server/RendezvousServer.h diff --git a/examples/all-clusters-app/esp32/main/main.cpp b/examples/all-clusters-app/esp32/main/main.cpp index 605daed52ec57b..b2e0674e2df293 100644 --- a/examples/all-clusters-app/esp32/main/main.cpp +++ b/examples/all-clusters-app/esp32/main/main.cpp @@ -346,7 +346,8 @@ class SetupListModel : public ListScreen::Model if (i == 0) { ConnectivityMgr().ClearWiFiStationProvision(); - chip::Server::GetInstance().GetCommissionManager().OpenBasicCommissioningWindow(ResetFabrics::kYes); + chip::Server::GetInstance().GetFabricTable().DeleteAllFabrics(); + chip::Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow(); } else if (i == 1) { @@ -355,9 +356,9 @@ class SetupListModel : public ListScreen::Model else if (i == 2) { app::MdnsServer::Instance().StartServer(Mdns::CommissioningMode::kEnabledBasic); - - chip::Server::GetInstance().GetCommissionManager().OpenBasicCommissioningWindow( - ResetFabrics::kYes, kNoCommissioningTimeout, CommissioningWindowAdvertisement::kMdns); + chip::Server::GetInstance().GetFabricTable().DeleteAllFabrics(); + chip::Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow( + kNoCommissioningTimeout, CommissioningWindowAdvertisement::kMdnsOnly); } } diff --git a/examples/lighting-app/k32w/main/AppTask.cpp b/examples/lighting-app/k32w/main/AppTask.cpp index 9e7428f26875a1..0050788e184eb4 100644 --- a/examples/lighting-app/k32w/main/AppTask.cpp +++ b/examples/lighting-app/k32w/main/AppTask.cpp @@ -489,8 +489,7 @@ void AppTask::BleHandler(AppEvent * aEvent) { ConnectivityMgr().SetBLEAdvertisingEnabled(true); - if (chip::Server::GetInstance().GetCommissionManager().OpenBasicCommissioningWindow(chip::ResetFabrics::kNo) == - CHIP_NO_ERROR) + if (chip::Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow() == CHIP_NO_ERROR) { K32W_LOG("Started BLE Advertising!"); } diff --git a/examples/lighting-app/mbed/CMakeLists.txt b/examples/lighting-app/mbed/CMakeLists.txt index 95382b0918a451..100889c0794535 100644 --- a/examples/lighting-app/mbed/CMakeLists.txt +++ b/examples/lighting-app/mbed/CMakeLists.txt @@ -72,9 +72,8 @@ target_sources(${APP_TARGET} PRIVATE ${CHIP_ROOT}/src/app/server/EchoHandler.cpp ${CHIP_ROOT}/src/app/server/Mdns.cpp ${CHIP_ROOT}/src/app/server/OnboardingCodesUtil.cpp - ${CHIP_ROOT}/src/app/server/RendezvousServer.cpp ${CHIP_ROOT}/src/app/server/Server.cpp - ${CHIP_ROOT}/src/app/server/CommissionManager.cpp + ${CHIP_ROOT}/src/app/server/CommissioningWindowManager.cpp ${CHIP_ROOT}/src/app/clusters/administrator-commissioning-server/administrator-commissioning-server.cpp ${CHIP_ROOT}/src/app/clusters/basic/basic.cpp ${CHIP_ROOT}/src/app/clusters/bindings/bindings.cpp diff --git a/examples/lighting-app/nrfconnect/main/AppTask.cpp b/examples/lighting-app/nrfconnect/main/AppTask.cpp index ad42a405433237..408935ba68a72e 100644 --- a/examples/lighting-app/nrfconnect/main/AppTask.cpp +++ b/examples/lighting-app/nrfconnect/main/AppTask.cpp @@ -386,7 +386,7 @@ void AppTask::StartBLEAdvertisementHandler(AppEvent * aEvent) return; } - if (chip::Server::GetInstance().GetCommissionManager().OpenBasicCommissioningWindow(chip::ResetFabrics::kNo) != CHIP_NO_ERROR) + if (chip::Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow() != CHIP_NO_ERROR) { LOG_ERR("OpenBasicCommissioningWindow() failed"); } diff --git a/examples/lighting-app/qpg/src/AppTask.cpp b/examples/lighting-app/qpg/src/AppTask.cpp index 8cdf66e9ad1625..b6bb6419d6c7a5 100644 --- a/examples/lighting-app/qpg/src/AppTask.cpp +++ b/examples/lighting-app/qpg/src/AppTask.cpp @@ -111,7 +111,7 @@ CHIP_ERROR AppTask::Init() PrintOnboardingCodes(chip::RendezvousInformationFlags(chip::RendezvousInformationFlag::kBLE)); // Enable BLE advertisements - chip::Server::GetInstance().GetCommissionManager().OpenBasicCommissioningWindow(chip::ResetFabrics::kNo); + chip::Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow(); ChipLogProgress(NotSpecified, "BLE advertising started. Waiting for Pairing."); return err; diff --git a/examples/lighting-app/telink/CMakeLists.txt b/examples/lighting-app/telink/CMakeLists.txt index 00a4502e868e2a..d6e5e1fc82e619 100644 --- a/examples/lighting-app/telink/CMakeLists.txt +++ b/examples/lighting-app/telink/CMakeLists.txt @@ -74,9 +74,8 @@ target_sources(app PRIVATE ${CHIP_ROOT}/src/app/server/EchoHandler.cpp ${CHIP_ROOT}/src/app/server/Mdns.cpp ${CHIP_ROOT}/src/app/server/OnboardingCodesUtil.cpp - ${CHIP_ROOT}/src/app/server/RendezvousServer.cpp ${CHIP_ROOT}/src/app/server/Server.cpp - ${CHIP_ROOT}/src/app/server/CommissionManager.cpp + ${CHIP_ROOT}/src/app/server/CommissioningWindowManager.cpp ${CHIP_ROOT}/src/app/clusters/administrator-commissioning-server/administrator-commissioning-server.cpp ${CHIP_ROOT}/src/app/clusters/basic/basic.cpp ${CHIP_ROOT}/src/app/clusters/bindings/bindings.cpp diff --git a/examples/lock-app/cc13x2x7_26x2x7/main/AppTask.cpp b/examples/lock-app/cc13x2x7_26x2x7/main/AppTask.cpp index fe663af7ddadec..86e3be14f69978 100644 --- a/examples/lock-app/cc13x2x7_26x2x7/main/AppTask.cpp +++ b/examples/lock-app/cc13x2x7_26x2x7/main/AppTask.cpp @@ -333,8 +333,7 @@ void AppTask::DispatchEvent(AppEvent * aEvent) // Enable BLE advertisements if (!ConnectivityMgr().IsBLEAdvertisingEnabled()) { - if (chip::Server::GetInstance().GetCommissionManager().OpenBasicCommissioningWindow(chip::ResetFabrics::kNo) == - CHIP_NO_ERROR) + if (chip::Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow() == CHIP_NO_ERROR) { PLAT_LOG("Enabled BLE Advertisement"); } diff --git a/examples/lock-app/k32w/main/AppTask.cpp b/examples/lock-app/k32w/main/AppTask.cpp index 38c570972ad70e..e95b73cb394b5b 100644 --- a/examples/lock-app/k32w/main/AppTask.cpp +++ b/examples/lock-app/k32w/main/AppTask.cpp @@ -528,8 +528,7 @@ void AppTask::BleHandler(void * aGenericEvent) { ConnectivityMgr().SetBLEAdvertisingEnabled(true); - if (chip::Server::GetInstance().GetCommissionManager().OpenBasicCommissioningWindow(chip::ResetFabrics::kNo) == - CHIP_NO_ERROR) + if (chip::Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow() == CHIP_NO_ERROR) { K32W_LOG("Started BLE Advertising!"); } diff --git a/examples/lock-app/mbed/CMakeLists.txt b/examples/lock-app/mbed/CMakeLists.txt index 4674b163e3f54b..be921949bcf45d 100644 --- a/examples/lock-app/mbed/CMakeLists.txt +++ b/examples/lock-app/mbed/CMakeLists.txt @@ -71,9 +71,8 @@ target_sources(${APP_TARGET} PRIVATE ${CHIP_ROOT}/src/app/server/EchoHandler.cpp ${CHIP_ROOT}/src/app/server/Mdns.cpp ${CHIP_ROOT}/src/app/server/OnboardingCodesUtil.cpp - ${CHIP_ROOT}/src/app/server/RendezvousServer.cpp ${CHIP_ROOT}/src/app/server/Server.cpp - ${CHIP_ROOT}/src/app/server/CommissionManager.cpp + ${CHIP_ROOT}/src/app/server/CommissioningWindowManager.cpp ${CHIP_ROOT}/src/app/clusters/administrator-commissioning-server/administrator-commissioning-server.cpp ${CHIP_ROOT}/src/app/clusters/basic/basic.cpp ${CHIP_ROOT}/src/app/clusters/diagnostic-logs-server/diagnostic-logs-server.cpp diff --git a/examples/lock-app/nrfconnect/main/AppTask.cpp b/examples/lock-app/nrfconnect/main/AppTask.cpp index b178d107b1d6a3..eeda5d717ba79a 100644 --- a/examples/lock-app/nrfconnect/main/AppTask.cpp +++ b/examples/lock-app/nrfconnect/main/AppTask.cpp @@ -386,7 +386,7 @@ void AppTask::StartBLEAdvertisementHandler(AppEvent * aEvent) return; } - if (chip::Server::GetInstance().GetCommissionManager().OpenBasicCommissioningWindow(chip::ResetFabrics::kNo) != CHIP_NO_ERROR) + if (chip::Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow() != CHIP_NO_ERROR) { LOG_ERR("OpenBasicCommissioningWindow() failed"); } diff --git a/examples/lock-app/qpg/src/AppTask.cpp b/examples/lock-app/qpg/src/AppTask.cpp index b1f73f8d13392f..7f641a0a6cbff2 100644 --- a/examples/lock-app/qpg/src/AppTask.cpp +++ b/examples/lock-app/qpg/src/AppTask.cpp @@ -350,8 +350,7 @@ void AppTask::FunctionHandler(AppEvent * aEvent) if (!ConnectivityMgr().IsThreadProvisioned()) { // Enable BLE advertisements and pairing window - if (chip::Server::GetInstance().GetCommissionManager().OpenBasicCommissioningWindow(chip::ResetFabrics::kNo) == - CHIP_NO_ERROR) + if (chip::Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow() == CHIP_NO_ERROR) { ChipLogProgress(NotSpecified, "BLE advertising started. Waiting for Pairing."); } diff --git a/examples/pump-app/cc13x2x7_26x2x7/main/AppTask.cpp b/examples/pump-app/cc13x2x7_26x2x7/main/AppTask.cpp index dc98dac5b73ccc..50a0d017ecfc80 100644 --- a/examples/pump-app/cc13x2x7_26x2x7/main/AppTask.cpp +++ b/examples/pump-app/cc13x2x7_26x2x7/main/AppTask.cpp @@ -335,8 +335,7 @@ void AppTask::DispatchEvent(AppEvent * aEvent) // Enable BLE advertisements if (!ConnectivityMgr().IsBLEAdvertisingEnabled()) { - if (chip::Server::GetInstance().GetCommissionManager().OpenBasicCommissioningWindow(chip::ResetFabrics::kNo) == - CHIP_NO_ERROR) + if (chip::Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow() == CHIP_NO_ERROR) { PLAT_LOG("Enabled BLE Advertisement"); } diff --git a/examples/pump-app/nrfconnect/main/AppTask.cpp b/examples/pump-app/nrfconnect/main/AppTask.cpp index 5fceff922cbc29..ae61ba78a1dc81 100644 --- a/examples/pump-app/nrfconnect/main/AppTask.cpp +++ b/examples/pump-app/nrfconnect/main/AppTask.cpp @@ -386,7 +386,7 @@ void AppTask::StartBLEAdvertisementHandler(AppEvent * aEvent) return; } - if (chip::Server::GetInstance().GetCommissionManager().OpenBasicCommissioningWindow(chip::ResetFabrics::kNo) != CHIP_NO_ERROR) + if (chip::Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow() != CHIP_NO_ERROR) { LOG_ERR("OpenBasicCommissioningWindow() failed"); } diff --git a/examples/pump-controller-app/cc13x2x7_26x2x7/main/AppTask.cpp b/examples/pump-controller-app/cc13x2x7_26x2x7/main/AppTask.cpp index f575e9a371581c..dd2d3d63200f7f 100644 --- a/examples/pump-controller-app/cc13x2x7_26x2x7/main/AppTask.cpp +++ b/examples/pump-controller-app/cc13x2x7_26x2x7/main/AppTask.cpp @@ -335,8 +335,7 @@ void AppTask::DispatchEvent(AppEvent * aEvent) // Enable BLE advertisements if (!ConnectivityMgr().IsBLEAdvertisingEnabled()) { - if (chip::Server::GetInstance().GetCommissionManager().OpenBasicCommissioningWindow(chip::ResetFabrics::kNo) == - CHIP_NO_ERROR) + if (chip::Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow() == CHIP_NO_ERROR) { PLAT_LOG("Enabled BLE Advertisement"); } diff --git a/examples/pump-controller-app/nrfconnect/main/AppTask.cpp b/examples/pump-controller-app/nrfconnect/main/AppTask.cpp index 5fceff922cbc29..ae61ba78a1dc81 100644 --- a/examples/pump-controller-app/nrfconnect/main/AppTask.cpp +++ b/examples/pump-controller-app/nrfconnect/main/AppTask.cpp @@ -386,7 +386,7 @@ void AppTask::StartBLEAdvertisementHandler(AppEvent * aEvent) return; } - if (chip::Server::GetInstance().GetCommissionManager().OpenBasicCommissioningWindow(chip::ResetFabrics::kNo) != CHIP_NO_ERROR) + if (chip::Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow() != CHIP_NO_ERROR) { LOG_ERR("OpenBasicCommissioningWindow() failed"); } diff --git a/examples/tv-casting-app/linux/main.cpp b/examples/tv-casting-app/linux/main.cpp index bcd7c5dd5f8d63..e056ea45fdb32f 100644 --- a/examples/tv-casting-app/linux/main.cpp +++ b/examples/tv-casting-app/linux/main.cpp @@ -104,8 +104,9 @@ void PrepareForCommissioning(const Mdns::DiscoveredNodeData * selectedCommission { // Enter commissioning mode, open commissioning window Server::GetInstance().Init(); - ReturnOnFailure(Server::GetInstance().GetCommissionManager().OpenBasicCommissioningWindow(ResetFabrics::kYes, - kCommissioningWindowTimeoutInSec)); + Server::GetInstance().GetFabricTable().DeleteAllFabrics(); + ReturnOnFailure( + Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow(kCommissioningWindowTimeoutInSec)); // Display onboarding payload chip::DeviceLayer::ConfigurationMgr().LogDeviceConfig(); diff --git a/src/app/chip_data_model.cmake b/src/app/chip_data_model.cmake index 556d3f25dea5fd..9a49ed854899c6 100644 --- a/src/app/chip_data_model.cmake +++ b/src/app/chip_data_model.cmake @@ -61,9 +61,8 @@ function(chip_configure_data_model APP_TARGET) ${CHIP_APP_BASE_DIR}/server/EchoHandler.cpp ${CHIP_APP_BASE_DIR}/server/Mdns.cpp ${CHIP_APP_BASE_DIR}/server/OnboardingCodesUtil.cpp - ${CHIP_APP_BASE_DIR}/server/RendezvousServer.cpp ${CHIP_APP_BASE_DIR}/server/Server.cpp - ${CHIP_APP_BASE_DIR}/server/CommissionManager.cpp + ${CHIP_APP_BASE_DIR}/server/CommissioningWindowManager.cpp ) endif() diff --git a/src/app/clusters/administrator-commissioning-server/administrator-commissioning-server.cpp b/src/app/clusters/administrator-commissioning-server/administrator-commissioning-server.cpp index d00de79d158dfc..0cea2193498336 100644 --- a/src/app/clusters/administrator-commissioning-server/administrator-commissioning-server.cpp +++ b/src/app/clusters/administrator-commissioning-server/administrator-commissioning-server.cpp @@ -43,7 +43,8 @@ bool emberAfAdministratorCommissioningClusterOpenCommissioningWindowCallback(End ChipLogProgress(Zcl, "Received command to open commissioning window"); - VerifyOrExit(!Server::GetInstance().GetCommissionManager().IsPairingWindowOpen(), status = EMBER_ZCL_STATUS_FAILURE); + VerifyOrExit(!Server::GetInstance().GetCommissioningWindowManager().IsCommissioningWindowOpen(), + status = EMBER_ZCL_STATUS_FAILURE); VerifyOrExit(sizeof(verifier) == pakeVerifier.size(), status = EMBER_ZCL_STATUS_FAILURE); VerifyOrExit(iterations >= kPBKDFMinimumIterations, status = EMBER_ZCL_STATUS_FAILURE); VerifyOrExit(iterations <= kPBKDFMaximumIterations, status = EMBER_ZCL_STATUS_FAILURE); @@ -55,7 +56,7 @@ bool emberAfAdministratorCommissioningClusterOpenCommissioningWindowCallback(End memcpy(verifier.mW0, &verifierData[0], kSpake2p_WS_Length); memcpy(verifier.mL, &verifierData[kSpake2p_WS_Length], kSpake2p_WS_Length); - VerifyOrExit(Server::GetInstance().GetCommissionManager().OpenEnhancedCommissioningWindow( + VerifyOrExit(Server::GetInstance().GetCommissioningWindowManager().OpenEnhancedCommissioningWindow( commissioningTimeout, discriminator, verifier, iterations, salt, passcodeID) == CHIP_NO_ERROR, status = EMBER_ZCL_STATUS_FAILURE); ChipLogProgress(Zcl, "Commissioning window is now open"); @@ -75,10 +76,11 @@ bool emberAfAdministratorCommissioningClusterOpenBasicCommissioningWindowCallbac { EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS; ChipLogProgress(Zcl, "Received command to open basic commissioning window"); - VerifyOrExit(!Server::GetInstance().GetCommissionManager().IsPairingWindowOpen(), status = EMBER_ZCL_STATUS_FAILURE); + VerifyOrExit(!Server::GetInstance().GetCommissioningWindowManager().IsCommissioningWindowOpen(), + status = EMBER_ZCL_STATUS_FAILURE); VerifyOrExit(commissioningTimeout <= kMaxCommissionioningTimeoutSeconds, status = EMBER_ZCL_STATUS_FAILURE); - VerifyOrExit(Server::GetInstance().GetCommissionManager().OpenBasicCommissioningWindow(ResetFabrics::kNo, - commissioningTimeout) == CHIP_NO_ERROR, + VerifyOrExit(Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow(commissioningTimeout) == + CHIP_NO_ERROR, status = EMBER_ZCL_STATUS_FAILURE); ChipLogProgress(Zcl, "Commissioning window is now open"); @@ -94,7 +96,7 @@ bool emberAfAdministratorCommissioningClusterOpenBasicCommissioningWindowCallbac bool emberAfAdministratorCommissioningClusterRevokeCommissioningCallback(EndpointId endpoint, app::CommandHandler * commandObj) { ChipLogProgress(Zcl, "Received command to close commissioning window"); - Server::GetInstance().GetCommissionManager().CloseCommissioningWindow(); + Server::GetInstance().GetCommissioningWindowManager().CloseCommissioningWindow(); ChipLogProgress(Zcl, "Commissioning window is now closed"); emberAfSendImmediateDefaultResponse(EMBER_ZCL_STATUS_SUCCESS); return true; diff --git a/src/app/server/BUILD.gn b/src/app/server/BUILD.gn index 508f3a703a4d30..fd87fe1ffdbaad 100644 --- a/src/app/server/BUILD.gn +++ b/src/app/server/BUILD.gn @@ -27,16 +27,14 @@ static_library("server") { output_name = "libCHIPAppServer" sources = [ - "CommissionManager.cpp", - "CommissionManager.h", + "CommissioningWindowManager.cpp", + "CommissioningWindowManager.h", "EchoHandler.cpp", "EchoHandler.h", "Mdns.cpp", "Mdns.h", "OnboardingCodesUtil.cpp", "OnboardingCodesUtil.h", - "RendezvousServer.cpp", - "RendezvousServer.h", "Server.cpp", "Server.h", ] diff --git a/src/app/server/CommissionManager.cpp b/src/app/server/CommissionManager.cpp deleted file mode 100644 index 436416f464d16f..00000000000000 --- a/src/app/server/CommissionManager.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/* - * - * Copyright (c) 2021 Project CHIP Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include - -namespace { - -void HandleCommissioningWindowTimeout(chip::System::Layer * aSystemLayer, void * aAppState) -{ - chip::CommissionManager * commissionMgr = static_cast(aAppState); - commissionMgr->CloseCommissioningWindow(); -} - -} // namespace - -namespace chip { - -CHIP_ERROR CommissionManager::OpenBasicCommissioningWindow(ResetFabrics resetFabrics, uint16_t commissioningTimeoutSeconds, - CommissioningWindowAdvertisement advertisementMode) -{ - // TODO(cecille): If this is re-called when the window is already open, what should happen? - RestoreDiscriminator(); - - uint32_t pinCode; - ReturnErrorOnFailure(DeviceLayer::ConfigurationMgr().GetSetupPinCode(pinCode)); - - RendezvousParameters params; - - params.SetSetupPINCode(pinCode); - params.SetAdvertisementDelegate(this); -#if CONFIG_NETWORK_LAYER_BLE - SetBLE(advertisementMode == chip::CommissioningWindowAdvertisement::kBle); - if (advertisementMode == chip::CommissioningWindowAdvertisement::kBle) - { - params.SetBleLayer(DeviceLayer::ConnectivityMgr().GetBleLayer()).SetPeerAddress(Transport::PeerAddress::BLE()); - } -#else - SetBLE(false); -#endif // CONFIG_NETWORK_LAYER_BLE - - if (resetFabrics == ResetFabrics::kYes) - { - mServer->GetFabricTable().DeleteAllFabrics(); - // Only resetting gNextAvailableFabricIndex at reboot otherwise previously paired device with fabricID 0 - // can continue sending messages to accessory as next available fabric will also be 0. - // This logic is not up to spec, will be implemented up to spec once AddOptCert is implemented. - mServer->GetFabricTable().Reset(); - } - - ReturnErrorOnFailure(mServer->GetRendezvousServer().WaitForPairing( - std::move(params), kSpake2p_Iteration_Count, - ByteSpan(reinterpret_cast(kSpake2pKeyExchangeSalt), strlen(kSpake2pKeyExchangeSalt)), 0, - &mServer->GetExchangManager(), &mServer->GetTransportManager(), &mServer->GetSecureSessionManager())); - - if (commissioningTimeoutSeconds != kNoCommissioningTimeout) - { - ReturnErrorOnFailure( - DeviceLayer::SystemLayer().StartTimer(commissioningTimeoutSeconds * 1000, HandleCommissioningWindowTimeout, this)); - } - - return CHIP_NO_ERROR; -} - -CHIP_ERROR CommissionManager::OpenEnhancedCommissioningWindow(uint16_t commissioningTimeoutSeconds, uint16_t discriminator, - PASEVerifier & verifier, uint32_t iterations, ByteSpan salt, - uint16_t passcodeID) -{ - RendezvousParameters params; - - ReturnErrorOnFailure(SetTemporaryDiscriminator(discriminator)); - - params.SetAdvertisementDelegate(this); -#if CONFIG_NETWORK_LAYER_BLE - SetBLE(true); - params.SetBleLayer(DeviceLayer::ConnectivityMgr().GetBleLayer()).SetPeerAddress(Transport::PeerAddress::BLE()); -#else - SetBLE(false); -#endif - - params.SetPASEVerifier(verifier).SetAdvertisementDelegate(this); - - ReturnErrorOnFailure(mServer->GetRendezvousServer().WaitForPairing( - std::move(params), iterations, salt, passcodeID, &mServer->GetExchangManager(), &mServer->GetTransportManager(), - &mServer->GetSecureSessionManager())); - - if (commissioningTimeoutSeconds != kNoCommissioningTimeout) - { - ReturnErrorOnFailure( - DeviceLayer::SystemLayer().StartTimer(commissioningTimeoutSeconds * 1000, HandleCommissioningWindowTimeout, this)); - } - - return CHIP_NO_ERROR; -} - -void CommissionManager::CloseCommissioningWindow() -{ - if (mCommissioningWindowOpen) - { - ChipLogProgress(AppServer, "Closing pairing window"); - mServer->GetRendezvousServer().Cleanup(); - } -} - -CHIP_ERROR CommissionManager::StartAdvertisement() -{ - if (mIsBLE) - { - ReturnErrorOnFailure(chip::DeviceLayer::ConnectivityMgr().SetBLEAdvertisingEnabled(true)); - } - if (mAppDelegate != nullptr) - { - mAppDelegate->OnPairingWindowOpened(); - } - mCommissioningWindowOpen = true; - return CHIP_NO_ERROR; -} - -CHIP_ERROR CommissionManager::StopAdvertisement() -{ - RestoreDiscriminator(); - - mCommissioningWindowOpen = false; - - if (mIsBLE) - { - ReturnErrorOnFailure(chip::DeviceLayer::ConnectivityMgr().SetBLEAdvertisingEnabled(false)); - } - - if (mAppDelegate != nullptr) - { - mAppDelegate->OnPairingWindowClosed(); - } - - return CHIP_NO_ERROR; -} - -CHIP_ERROR CommissionManager::SetTemporaryDiscriminator(uint16_t discriminator) -{ - if (!mOriginalDiscriminatorCached) - { - // Cache the original discriminator - ReturnErrorOnFailure(DeviceLayer::ConfigurationMgr().GetSetupDiscriminator(mOriginalDiscriminator)); - mOriginalDiscriminatorCached = true; - } - - return DeviceLayer::ConfigurationMgr().StoreSetupDiscriminator(discriminator); -} - -CHIP_ERROR CommissionManager::RestoreDiscriminator() -{ - if (mOriginalDiscriminatorCached) - { - // Restore the original discriminator - ReturnErrorOnFailure(DeviceLayer::ConfigurationMgr().StoreSetupDiscriminator(mOriginalDiscriminator)); - mOriginalDiscriminatorCached = false; - } - - return CHIP_NO_ERROR; -} - -} // namespace chip diff --git a/src/app/server/CommissioningWindowManager.cpp b/src/app/server/CommissioningWindowManager.cpp new file mode 100644 index 00000000000000..3a0eb6f1aefee6 --- /dev/null +++ b/src/app/server/CommissioningWindowManager.cpp @@ -0,0 +1,267 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include + +#if CHIP_ENABLE_OPENTHREAD +#include +#endif +#include + +namespace { + +void HandleCommissioningWindowTimeout(chip::System::Layer * aSystemLayer, void * aAppState) +{ + chip::CommissioningWindowManager * commissionMgr = static_cast(aAppState); + commissionMgr->CloseCommissioningWindow(); +} + +void OnPlatformEventWrapper(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg) +{ + chip::CommissioningWindowManager * commissionMgr = reinterpret_cast(arg); + commissionMgr->OnPlatformEvent(event); +} +} // namespace + +namespace chip { + +void CommissioningWindowManager::OnPlatformEvent(const DeviceLayer::ChipDeviceEvent * event) +{ + if (event->Type == DeviceLayer::DeviceEventType::kCommissioningComplete) + { + if (event->CommissioningComplete.status == CHIP_NO_ERROR) + { + ChipLogProgress(AppServer, "Commissioning completed successfully"); + } + else + { + ChipLogError(AppServer, "Commissioning errored out with error %" CHIP_ERROR_FORMAT, + event->CommissioningComplete.status.Format()); + } + // reset all advertising + app::MdnsServer::Instance().StartServer(Mdns::CommissioningMode::kDisabled); + } + else if (event->Type == DeviceLayer::DeviceEventType::kOperationalNetworkEnabled) + { + app::MdnsServer::Instance().AdvertiseOperational(); + ChipLogError(AppServer, "Operational advertising enabled"); + } +} + +void CommissioningWindowManager::Cleanup() +{ + mServer->GetExchangManager().UnregisterUnsolicitedMessageHandlerForType(Protocols::SecureChannel::MsgType::PBKDFParamRequest); + StopAdvertisement(); + + // reset all advertising + app::MdnsServer::Instance().StartServer(Mdns::CommissioningMode::kDisabled); +} + +void CommissioningWindowManager::OnSessionEstablishmentError(CHIP_ERROR err) +{ + Cleanup(); + + ChipLogError(AppServer, "Commissioning failed during session establishment: %s", ErrorStr(err)); + + if (mAppDelegate != nullptr) + { + mAppDelegate->OnRendezvousStopped(); + } +} + +void CommissioningWindowManager::OnSessionEstablished() +{ + CHIP_ERROR err = mServer->GetSecureSessionManager().NewPairing( + Optional::Value(mPairingSession.GetPeerAddress()), mPairingSession.GetPeerNodeId(), + &mPairingSession, SecureSession::SessionRole::kResponder, 0); + if (err != CHIP_NO_ERROR) + { + ChipLogError(AppServer, "Commissioning failed while setting up secure channel: err %s", ErrorStr(err)); + OnSessionEstablishmentError(err); + return; + } + + ChipLogProgress(AppServer, "Commissioning completed session establishment step"); + if (mAppDelegate != nullptr) + { + mAppDelegate->OnRendezvousStarted(); + } + + DeviceLayer::PlatformMgr().AddEventHandler(OnPlatformEventWrapper, reinterpret_cast(this)); + + Cleanup(); + ChipLogProgress(AppServer, "Device completed Rendezvous process"); +} + +CHIP_ERROR CommissioningWindowManager::PrepareCommissioningWindow(uint16_t commissioningTimeoutSeconds, + uint16_t & allocatedSessionID) +{ + ReturnErrorOnFailure(mIDAllocator->Allocate(allocatedSessionID)); + + ReturnErrorOnFailure(mPairingSession.MessageDispatch().Init(&mServer->GetSecureSessionManager())); + + if (commissioningTimeoutSeconds != kNoCommissioningTimeout) + { + ReturnErrorOnFailure( + DeviceLayer::SystemLayer().StartTimer(commissioningTimeoutSeconds * 1000, HandleCommissioningWindowTimeout, this)); + } + + ReturnErrorOnFailure(mServer->GetExchangManager().RegisterUnsolicitedMessageHandlerForType( + Protocols::SecureChannel::MsgType::PBKDFParamRequest, &mPairingSession)); + + return StartAdvertisement(); +} + +CHIP_ERROR CommissioningWindowManager::OpenBasicCommissioningWindow(uint16_t commissioningTimeoutSeconds, + CommissioningWindowAdvertisement advertisementMode) +{ + RestoreDiscriminator(); + +#if CONFIG_NETWORK_LAYER_BLE + // Enable BLE advertisements if commissioning window is to be opened on all supported + // transports, and BLE is supported on the current device. + SetBLE(advertisementMode == chip::CommissioningWindowAdvertisement::kAllSupported); +#else + SetBLE(false); +#endif // CONFIG_NETWORK_LAYER_BLE + + uint16_t keyID = 0; + CHIP_ERROR err = CHIP_NO_ERROR; + uint32_t pinCode; + + SuccessOrExit(err = DeviceLayer::ConfigurationMgr().GetSetupPinCode(pinCode)); + SuccessOrExit(err = PrepareCommissioningWindow(commissioningTimeoutSeconds, keyID)); + SuccessOrExit(err = mPairingSession.WaitForPairing( + pinCode, kSpake2p_Iteration_Count, + ByteSpan(reinterpret_cast(kSpake2pKeyExchangeSalt), strlen(kSpake2pKeyExchangeSalt)), keyID, + this)); + + // reset all advertising, indicating we are in commissioningMode + // and we were put into this state via a command for additional commissioning + app::MdnsServer::Instance().StartServer(Mdns::CommissioningMode::kEnabledBasic); + +exit: + if (err != CHIP_NO_ERROR) + { + Cleanup(); + } + return err; +} + +CHIP_ERROR CommissioningWindowManager::OpenEnhancedCommissioningWindow(uint16_t commissioningTimeoutSeconds, uint16_t discriminator, + PASEVerifier & verifier, uint32_t iterations, ByteSpan salt, + uint16_t passcodeID) +{ +#if CONFIG_NETWORK_LAYER_BLE + // TODO: Don't use BLE for commissioning additional fabrics on a device + SetBLE(true); +#else + SetBLE(false); +#endif + + uint16_t keyID = 0; + CHIP_ERROR err = CHIP_NO_ERROR; + + SuccessOrExit(err = SetTemporaryDiscriminator(discriminator)); + SuccessOrExit(err = PrepareCommissioningWindow(commissioningTimeoutSeconds, keyID)); + SuccessOrExit(err = mPairingSession.WaitForPairing(verifier, iterations, salt, passcodeID, keyID, this)); + + // reset all advertising, indicating we are in commissioningMode + // and we were put into this state via a command for additional commissioning + app::MdnsServer::Instance().StartServer(Mdns::CommissioningMode::kEnabledEnhanced); + +exit: + if (err != CHIP_NO_ERROR) + { + Cleanup(); + } + return err; +} + +void CommissioningWindowManager::CloseCommissioningWindow() +{ + if (mCommissioningWindowOpen) + { + ChipLogProgress(AppServer, "Closing pairing window"); + Cleanup(); + } +} + +CHIP_ERROR CommissioningWindowManager::StartAdvertisement() +{ + if (mIsBLE) + { + ReturnErrorOnFailure(chip::DeviceLayer::ConnectivityMgr().SetBLEAdvertisingEnabled(true)); + } + if (mAppDelegate != nullptr) + { + mAppDelegate->OnPairingWindowOpened(); + } + mCommissioningWindowOpen = true; + return CHIP_NO_ERROR; +} + +CHIP_ERROR CommissioningWindowManager::StopAdvertisement() +{ + RestoreDiscriminator(); + + mCommissioningWindowOpen = false; + + if (mIsBLE) + { + ReturnErrorOnFailure(chip::DeviceLayer::ConnectivityMgr().SetBLEAdvertisingEnabled(false)); + } + + if (mAppDelegate != nullptr) + { + mAppDelegate->OnPairingWindowClosed(); + } + + return CHIP_NO_ERROR; +} + +CHIP_ERROR CommissioningWindowManager::SetTemporaryDiscriminator(uint16_t discriminator) +{ + if (!mOriginalDiscriminatorCached) + { + // Cache the original discriminator + ReturnErrorOnFailure(DeviceLayer::ConfigurationMgr().GetSetupDiscriminator(mOriginalDiscriminator)); + mOriginalDiscriminatorCached = true; + } + + return DeviceLayer::ConfigurationMgr().StoreSetupDiscriminator(discriminator); +} + +CHIP_ERROR CommissioningWindowManager::RestoreDiscriminator() +{ + if (mOriginalDiscriminatorCached) + { + // Restore the original discriminator + ReturnErrorOnFailure(DeviceLayer::ConfigurationMgr().StoreSetupDiscriminator(mOriginalDiscriminator)); + mOriginalDiscriminatorCached = false; + } + + return CHIP_NO_ERROR; +} + +} // namespace chip diff --git a/src/app/server/CommissionManager.h b/src/app/server/CommissioningWindowManager.h similarity index 60% rename from src/app/server/CommissionManager.h rename to src/app/server/CommissioningWindowManager.h index 288dd0d2cb02da..083ed25a3f0a5d 100644 --- a/src/app/server/CommissionManager.h +++ b/src/app/server/CommissioningWindowManager.h @@ -19,40 +19,38 @@ #include #include +#include namespace chip { -enum class ResetFabrics -{ - kYes, - kNo, -}; - constexpr uint16_t kNoCommissioningTimeout = UINT16_MAX; enum class CommissioningWindowAdvertisement { - kBle, - kMdns, + kAllSupported, + kMdnsOnly, }; class Server; -class CommissionManager : public RendezvousAdvertisementDelegate +class CommissioningWindowManager : public SessionEstablishmentDelegate { public: - CommissionManager(Server * server) : mAppDelegate(nullptr), mServer(server) {} + CommissioningWindowManager(Server * server) : mAppDelegate(nullptr), mServer(server) {} void SetAppDelegate(AppDelegate * delegate) { mAppDelegate = delegate; } void SetBLE(bool ble) { mIsBLE = ble; } + void SetSessionIDAllocator(SessionIDAllocator * idAllocator) { mIDAllocator = idAllocator; } + /** * Open the pairing window using default configured parameters. */ CHIP_ERROR - OpenBasicCommissioningWindow(ResetFabrics resetFabrics, uint16_t commissioningTimeoutSeconds = kNoCommissioningTimeout, - CommissioningWindowAdvertisement advertisementMode = chip::CommissioningWindowAdvertisement::kBle); + OpenBasicCommissioningWindow( + uint16_t commissioningTimeoutSeconds = kNoCommissioningTimeout, + CommissioningWindowAdvertisement advertisementMode = chip::CommissioningWindowAdvertisement::kAllSupported); CHIP_ERROR OpenEnhancedCommissioningWindow(uint16_t commissioningTimeoutSeconds, uint16_t discriminator, PASEVerifier & verifier, uint32_t iterations, chip::ByteSpan salt, @@ -60,17 +58,27 @@ class CommissionManager : public RendezvousAdvertisementDelegate void CloseCommissioningWindow(); - bool IsPairingWindowOpen() { return mCommissioningWindowOpen; } + bool IsCommissioningWindowOpen() { return mCommissioningWindowOpen; } + + //////////// SessionEstablishmentDelegate Implementation /////////////// + void OnSessionEstablishmentError(CHIP_ERROR error) override; + void OnSessionEstablished() override; - CHIP_ERROR StartAdvertisement() override; + void Cleanup(); - CHIP_ERROR StopAdvertisement() override; + void OnPlatformEvent(const DeviceLayer::ChipDeviceEvent * event); private: CHIP_ERROR SetTemporaryDiscriminator(uint16_t discriminator); CHIP_ERROR RestoreDiscriminator(); + CHIP_ERROR StartAdvertisement(); + + CHIP_ERROR StopAdvertisement(); + + CHIP_ERROR PrepareCommissioningWindow(uint16_t commissioningTimeoutSeconds, uint16_t & allocatedSessionID); + AppDelegate * mAppDelegate = nullptr; Server * mServer = nullptr; @@ -79,6 +87,9 @@ class CommissionManager : public RendezvousAdvertisementDelegate bool mOriginalDiscriminatorCached = false; uint16_t mOriginalDiscriminator = 0; + + SessionIDAllocator * mIDAllocator = nullptr; + PASESession mPairingSession; }; } // namespace chip diff --git a/src/app/server/RendezvousServer.cpp b/src/app/server/RendezvousServer.cpp deleted file mode 100644 index 422f4ca624ff59..00000000000000 --- a/src/app/server/RendezvousServer.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/* - * - * Copyright (c) 2020 Project CHIP Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include -#include -#include -#include -#include - -#if CHIP_ENABLE_OPENTHREAD -#include -#endif -#include - -using namespace ::chip::Inet; -using namespace ::chip::Transport; -using namespace ::chip::DeviceLayer; - -namespace chip { - -namespace { -void OnPlatformEventWrapper(const DeviceLayer::ChipDeviceEvent * event, intptr_t arg) -{ - RendezvousServer * server = reinterpret_cast(arg); - server->OnPlatformEvent(event); -} -} // namespace - -void RendezvousServer::OnPlatformEvent(const DeviceLayer::ChipDeviceEvent * event) -{ - if (event->Type == DeviceLayer::DeviceEventType::kCommissioningComplete) - { - if (event->CommissioningComplete.status == CHIP_NO_ERROR) - { - ChipLogProgress(Discovery, "Commissioning completed successfully"); - } - else - { - ChipLogError(Discovery, "Commissioning errored out with error %" CHIP_ERROR_FORMAT, - event->CommissioningComplete.status.Format()); - } - // reset all advertising - app::MdnsServer::Instance().StartServer(Mdns::CommissioningMode::kDisabled); - } - else if (event->Type == DeviceLayer::DeviceEventType::kOperationalNetworkEnabled) - { - app::MdnsServer::Instance().AdvertiseOperational(); - ChipLogError(Discovery, "Operational advertising enabled"); - } -} - -CHIP_ERROR RendezvousServer::WaitForPairing(const RendezvousParameters & params, uint32_t pbkdf2IterCount, const ByteSpan & salt, - uint16_t passcodeID, Messaging::ExchangeManager * exchangeManager, - TransportMgrBase * transportMgr, SecureSessionMgr * sessionMgr) -{ - VerifyOrReturnError(transportMgr != nullptr, CHIP_ERROR_INVALID_ARGUMENT); - VerifyOrReturnError(exchangeManager != nullptr, CHIP_ERROR_INVALID_ARGUMENT); - VerifyOrReturnError(sessionMgr != nullptr, CHIP_ERROR_INVALID_ARGUMENT); - VerifyOrReturnError(params.HasSetupPINCode() || params.HasPASEVerifier(), CHIP_ERROR_INVALID_ARGUMENT); - -#if CONFIG_NETWORK_LAYER_BLE - VerifyOrReturnError(params.HasAdvertisementDelegate(), CHIP_ERROR_INVALID_ARGUMENT); -#endif - - mAdvDelegate = params.GetAdvertisementDelegate(); - - if (params.GetPeerAddress().GetTransportType() == Transport::Type::kBle) -#if !CONFIG_NETWORK_LAYER_BLE - { - return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE; - } -#endif - - ChipLogProgress(Discovery, "WaitForPairing(): HasAdvertisementDelegate %d", HasAdvertisementDelegate()); - if (HasAdvertisementDelegate()) - { - ReturnErrorOnFailure(GetAdvertisementDelegate()->StartAdvertisement()); - } - - // reset all advertising, indicating we are in commissioningMode - // and we were put into this state via a command for additional commissioning - // NOTE: when device has never been commissioned, Rendezvous will ensure AP is false - app::MdnsServer::Instance().StartServer(params.HasPASEVerifier() ? Mdns::CommissioningMode::kEnabledBasic - : Mdns::CommissioningMode::kEnabledEnhanced); - - mSessionMgr = sessionMgr; - mExchangeManager = exchangeManager; - - ReturnErrorOnFailure(mExchangeManager->RegisterUnsolicitedMessageHandlerForType( - Protocols::SecureChannel::MsgType::PBKDFParamRequest, &mPairingSession)); - - uint16_t keyID = 0; - ReturnErrorOnFailure(mIDAllocator->Allocate(keyID)); - - if (params.HasPASEVerifier()) - { - ReturnErrorOnFailure( - mPairingSession.WaitForPairing(params.GetPASEVerifier(), pbkdf2IterCount, salt, passcodeID, keyID, this)); - } - else - { - ReturnErrorOnFailure(mPairingSession.WaitForPairing(params.GetSetupPINCode(), pbkdf2IterCount, salt, keyID, this)); - } - - ReturnErrorOnFailure(mPairingSession.MessageDispatch().Init(mSessionMgr)); - - return CHIP_NO_ERROR; -} - -void RendezvousServer::Cleanup() -{ - mExchangeManager->UnregisterUnsolicitedMessageHandlerForType(Protocols::SecureChannel::MsgType::PBKDFParamRequest); - - if (HasAdvertisementDelegate()) - { - GetAdvertisementDelegate()->StopAdvertisement(); - } - - // reset all advertising - app::MdnsServer::Instance().StartServer(Mdns::CommissioningMode::kDisabled); -} - -void RendezvousServer::OnSessionEstablishmentError(CHIP_ERROR err) -{ - Cleanup(); - - ChipLogProgress(AppServer, "OnSessionEstablishmentError: %s", ErrorStr(err)); - ChipLogProgress(AppServer, "Failed in SPAKE2+ handshake"); - - if (mDelegate != nullptr) - { - mDelegate->OnRendezvousStopped(); - } -} - -void RendezvousServer::OnSessionEstablished() -{ - CHIP_ERROR err = - mSessionMgr->NewPairing(Optional::Value(mPairingSession.GetPeerAddress()), - mPairingSession.GetPeerNodeId(), &mPairingSession, SecureSession::SessionRole::kResponder, 0); - if (err != CHIP_NO_ERROR) - { - ChipLogError(Ble, "Failed in setting up secure channel: err %s", ErrorStr(err)); - OnSessionEstablishmentError(err); - return; - } - - ChipLogProgress(AppServer, "Device completed SPAKE2+ handshake"); - if (mDelegate != nullptr) - { - mDelegate->OnRendezvousStarted(); - } - - DeviceLayer::PlatformMgr().AddEventHandler(OnPlatformEventWrapper, reinterpret_cast(this)); - - if (mPairingSession.GetPeerAddress().GetTransportType() == Transport::Type::kBle) - { - Cleanup(); - } - else - { - Cleanup(); - } - - ChipLogProgress(AppServer, "Device completed Rendezvous process"); -} -} // namespace chip diff --git a/src/app/server/RendezvousServer.h b/src/app/server/RendezvousServer.h deleted file mode 100644 index 4a73a0ae00acc4..00000000000000 --- a/src/app/server/RendezvousServer.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * - * Copyright (c) 2020 Project CHIP Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include -#include -#include -#include -#include - -namespace chip { - -class RendezvousServer : public SessionEstablishmentDelegate -{ -public: - CHIP_ERROR WaitForPairing(const RendezvousParameters & params, uint32_t pbkdf2IterCount, const ByteSpan & salt, - uint16_t passcodeID, Messaging::ExchangeManager * exchangeManager, TransportMgrBase * transportMgr, - SecureSessionMgr * sessionMgr); - - CHIP_ERROR Init(AppDelegate * delegate, SessionIDAllocator * idAllocator) - { - VerifyOrReturnError(idAllocator != nullptr, CHIP_ERROR_INVALID_ARGUMENT); - mIDAllocator = idAllocator; - - // The caller may chose to not provide a delegate object. The RendezvousServer checks for null delegate before calling - // its methods. - mDelegate = delegate; - return CHIP_NO_ERROR; - } - - //////////// SessionEstablishmentDelegate Implementation /////////////// - void OnSessionEstablishmentError(CHIP_ERROR error) override; - void OnSessionEstablished() override; - - void Cleanup(); - - void OnPlatformEvent(const DeviceLayer::ChipDeviceEvent * event); - -private: - AppDelegate * mDelegate; - Messaging::ExchangeManager * mExchangeManager = nullptr; - - PASESession mPairingSession; - SecureSessionMgr * mSessionMgr = nullptr; - - SessionIDAllocator * mIDAllocator = nullptr; - - RendezvousAdvertisementDelegate * mAdvDelegate; - - bool HasAdvertisementDelegate() const { return mAdvDelegate != nullptr; } - RendezvousAdvertisementDelegate * GetAdvertisementDelegate() { return mAdvDelegate; } -}; - -} // namespace chip diff --git a/src/app/server/Server.cpp b/src/app/server/Server.cpp index 924d5fbf33497e..2ba3f7c315cb3b 100644 --- a/src/app/server/Server.cpp +++ b/src/app/server/Server.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include #include @@ -82,7 +81,8 @@ CHIP_ERROR Server::Init(AppDelegate * delegate, uint16_t secureServicePort, uint chip::Platform::MemoryInit(); - mCommissionManager.SetAppDelegate(delegate); + mCommissioningWindowManager.SetAppDelegate(delegate); + mCommissioningWindowManager.SetSessionIDAllocator(&mSessionIDAllocator); InitDataModelHandler(&mExchangeMgr); #if CHIP_DEVICE_LAYER_TARGET_DARWIN @@ -92,9 +92,6 @@ CHIP_ERROR Server::Init(AppDelegate * delegate, uint16_t secureServicePort, uint DeviceLayer::PersistedStorage::KeyValueStoreMgrImpl().Init(CHIP_CONFIG_KVS_PATH); #endif - err = mRendezvousServer.Init(mAppDelegate, &mSessionIDAllocator); - SuccessOrExit(err); - err = mFabrics.Init(&mServerStorage); SuccessOrExit(err); @@ -147,7 +144,8 @@ CHIP_ERROR Server::Init(AppDelegate * delegate, uint16_t secureServicePort, uint else { #if CHIP_DEVICE_CONFIG_ENABLE_PAIRING_AUTOSTART - SuccessOrExit(err = mCommissionManager.OpenBasicCommissioningWindow(ResetFabrics::kYes)); + GetFabricTable().DeleteAllFabrics(); + SuccessOrExit(err = mCommissioningWindowManager.OpenBasicCommissioningWindow()); #endif } @@ -196,7 +194,7 @@ void Server::Shutdown() mExchangeMgr.Shutdown(); mSessions.Shutdown(); mTransports.Close(); - mRendezvousServer.Cleanup(); + mCommissioningWindowManager.Cleanup(); chip::Platform::MemoryShutdown(); } diff --git a/src/app/server/Server.h b/src/app/server/Server.h index 4dbf09429dc3ab..00ab301b1df9c3 100644 --- a/src/app/server/Server.h +++ b/src/app/server/Server.h @@ -18,8 +18,7 @@ #pragma once #include -#include -#include +#include #include #include #include @@ -62,8 +61,6 @@ class Server : public Messaging::ExchangeDelegate CHIP_ERROR AddTestCommissioning(); - void SetFabricIndex(FabricIndex id) { mFabricIndex = id; } - Transport::FabricTable & GetFabricTable() { return mFabrics; } Messaging::ExchangeManager & GetExchangManager() { return mExchangeMgr; } @@ -72,18 +69,16 @@ class Server : public Messaging::ExchangeDelegate SecureSessionMgr & GetSecureSessionManager() { return mSessions; } - RendezvousServer & GetRendezvousServer() { return mRendezvousServer; } - TransportMgrBase & GetTransportManager() { return mTransports; } - CommissionManager & GetCommissionManager() { return mCommissionManager; } + CommissioningWindowManager & GetCommissioningWindowManager() { return mCommissioningWindowManager; } void Shutdown(); static Server & GetInstance() { return sServer; } private: - Server() : mCommissionManager(this) {} + Server() : mCommissioningWindowManager(this) {} static Server sServer; @@ -117,7 +112,6 @@ class Server : public Messaging::ExchangeDelegate ServerTransportMgr mTransports; SecureSessionMgr mSessions; - RendezvousServer mRendezvousServer; CASEServer mCASEServer; Messaging::ExchangeManager mExchangeMgr; Transport::FabricTable mFabrics; @@ -129,12 +123,11 @@ class Server : public Messaging::ExchangeDelegate SecurePairingUsingTestSecret mTestPairing; ServerStorageDelegate mServerStorage; - CommissionManager mCommissionManager; + CommissioningWindowManager mCommissioningWindowManager; // TODO @ceille: Maybe use OperationalServicePort and CommissionableServicePort uint16_t mSecuredServicePort; uint16_t mUnsecuredServicePort; - FabricIndex mFabricIndex; }; } // namespace chip diff --git a/src/app/tests/TestCommissionManager.cpp b/src/app/tests/TestCommissionManager.cpp index 1bc33ea491c4ad..0b1e1236d80be7 100644 --- a/src/app/tests/TestCommissionManager.cpp +++ b/src/app/tests/TestCommissionManager.cpp @@ -15,7 +15,7 @@ * limitations under the License. */ -#include +#include #include #include #include @@ -28,9 +28,8 @@ #include using chip::CommissioningWindowAdvertisement; -using chip::CommissionManager; +using chip::CommissioningWindowManager; using chip::kNoCommissioningTimeout; -using chip::ResetFabrics; using chip::Server; // Mock function for linking @@ -53,56 +52,56 @@ void InitializeChip(nlTestSuite * suite) NL_TEST_ASSERT(suite, err == CHIP_NO_ERROR); } -void CheckCommissionManagerBasicWindowOpenCloseTask(intptr_t context) +void CheckCommissioningWindowManagerBasicWindowOpenCloseTask(intptr_t context) { - nlTestSuite * suite = reinterpret_cast(context); - CommissionManager & commissionMgr = Server::GetInstance().GetCommissionManager(); - CHIP_ERROR err = commissionMgr.OpenBasicCommissioningWindow(ResetFabrics::kNo, kNoCommissioningTimeout, - CommissioningWindowAdvertisement::kMdns); + nlTestSuite * suite = reinterpret_cast(context); + CommissioningWindowManager & commissionMgr = Server::GetInstance().GetCommissioningWindowManager(); + CHIP_ERROR err = + commissionMgr.OpenBasicCommissioningWindow(kNoCommissioningTimeout, CommissioningWindowAdvertisement::kMdnsOnly); NL_TEST_ASSERT(suite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(suite, commissionMgr.IsPairingWindowOpen()); + NL_TEST_ASSERT(suite, commissionMgr.IsCommissioningWindowOpen()); commissionMgr.CloseCommissioningWindow(); - NL_TEST_ASSERT(suite, !commissionMgr.IsPairingWindowOpen()); + NL_TEST_ASSERT(suite, !commissionMgr.IsCommissioningWindowOpen()); } -void CheckCommissionManagerBasicWindowOpenClose(nlTestSuite * suite, void *) +void CheckCommissioningWindowManagerBasicWindowOpenClose(nlTestSuite * suite, void *) { - chip::DeviceLayer::PlatformMgr().ScheduleWork(CheckCommissionManagerBasicWindowOpenCloseTask, + chip::DeviceLayer::PlatformMgr().ScheduleWork(CheckCommissioningWindowManagerBasicWindowOpenCloseTask, reinterpret_cast(suite)); sleep(kTestTaskWaitSeconds); } -void CheckCommissionManagerWindowClosedTask(chip::System::Layer *, void * context) +void CheckCommissioningWindowManagerWindowClosedTask(chip::System::Layer *, void * context) { - nlTestSuite * suite = static_cast(context); - CommissionManager & commissionMgr = Server::GetInstance().GetCommissionManager(); - NL_TEST_ASSERT(suite, !commissionMgr.IsPairingWindowOpen()); + nlTestSuite * suite = static_cast(context); + CommissioningWindowManager & commissionMgr = Server::GetInstance().GetCommissioningWindowManager(); + NL_TEST_ASSERT(suite, !commissionMgr.IsCommissioningWindowOpen()); } -void CheckCommissionManagerWindowTimeoutTask(intptr_t context) +void CheckCommissioningWindowManagerWindowTimeoutTask(intptr_t context) { - nlTestSuite * suite = reinterpret_cast(context); - CommissionManager & commissionMgr = Server::GetInstance().GetCommissionManager(); - constexpr uint16_t kTimeoutSeconds = 1; - constexpr uint16_t kTimeoutMs = 1000; - constexpr unsigned kSleepPadding = 100; - CHIP_ERROR err = - commissionMgr.OpenBasicCommissioningWindow(ResetFabrics::kNo, kTimeoutSeconds, CommissioningWindowAdvertisement::kMdns); + nlTestSuite * suite = reinterpret_cast(context); + CommissioningWindowManager & commissionMgr = Server::GetInstance().GetCommissioningWindowManager(); + constexpr uint16_t kTimeoutSeconds = 1; + constexpr uint16_t kTimeoutMs = 1000; + constexpr unsigned kSleepPadding = 100; + CHIP_ERROR err = commissionMgr.OpenBasicCommissioningWindow(kTimeoutSeconds, CommissioningWindowAdvertisement::kMdnsOnly); NL_TEST_ASSERT(suite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(suite, commissionMgr.IsPairingWindowOpen()); - chip::DeviceLayer::SystemLayer().StartTimer(kTimeoutMs + kSleepPadding, CheckCommissionManagerWindowClosedTask, suite); + NL_TEST_ASSERT(suite, commissionMgr.IsCommissioningWindowOpen()); + chip::DeviceLayer::SystemLayer().StartTimer(kTimeoutMs + kSleepPadding, CheckCommissioningWindowManagerWindowClosedTask, suite); } -void CheckCommissionManagerWindowTimeout(nlTestSuite * suite, void *) +void CheckCommissioningWindowManagerWindowTimeout(nlTestSuite * suite, void *) { - chip::DeviceLayer::PlatformMgr().ScheduleWork(CheckCommissionManagerWindowTimeoutTask, reinterpret_cast(suite)); + chip::DeviceLayer::PlatformMgr().ScheduleWork(CheckCommissioningWindowManagerWindowTimeoutTask, + reinterpret_cast(suite)); sleep(kTestTaskWaitSeconds); } -void CheckCommissionManagerEnhancedWindowTask(intptr_t context) +void CheckCommissioningWindowManagerEnhancedWindowTask(intptr_t context) { - nlTestSuite * suite = reinterpret_cast(context); - CommissionManager & commissionMgr = Server::GetInstance().GetCommissionManager(); + nlTestSuite * suite = reinterpret_cast(context); + CommissioningWindowManager & commissionMgr = Server::GetInstance().GetCommissioningWindowManager(); uint16_t originDiscriminator; CHIP_ERROR err = chip::DeviceLayer::ConfigurationMgr().GetSetupDiscriminator(originDiscriminator); NL_TEST_ASSERT(suite, err == CHIP_NO_ERROR); @@ -117,21 +116,22 @@ void CheckCommissionManagerEnhancedWindowTask(intptr_t context) err = commissionMgr.OpenEnhancedCommissioningWindow(kNoCommissioningTimeout, newDiscriminator, verifier, kIterations, saltData, kPasscodeID); NL_TEST_ASSERT(suite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(suite, commissionMgr.IsPairingWindowOpen()); + NL_TEST_ASSERT(suite, commissionMgr.IsCommissioningWindowOpen()); err = chip::DeviceLayer::ConfigurationMgr().GetSetupDiscriminator(currentDiscriminator); NL_TEST_ASSERT(suite, err == CHIP_NO_ERROR); NL_TEST_ASSERT(suite, currentDiscriminator == newDiscriminator); commissionMgr.CloseCommissioningWindow(); - NL_TEST_ASSERT(suite, !commissionMgr.IsPairingWindowOpen()); + NL_TEST_ASSERT(suite, !commissionMgr.IsCommissioningWindowOpen()); err = chip::DeviceLayer::ConfigurationMgr().GetSetupDiscriminator(currentDiscriminator); NL_TEST_ASSERT(suite, err == CHIP_NO_ERROR); NL_TEST_ASSERT(suite, currentDiscriminator == originDiscriminator); } -void CheckCommissionManagerEnhancedWindow(nlTestSuite * suite, void *) +void CheckCommissioningWindowManagerEnhancedWindow(nlTestSuite * suite, void *) { - chip::DeviceLayer::PlatformMgr().ScheduleWork(CheckCommissionManagerEnhancedWindowTask, reinterpret_cast(suite)); + chip::DeviceLayer::PlatformMgr().ScheduleWork(CheckCommissioningWindowManagerEnhancedWindowTask, + reinterpret_cast(suite)); sleep(kTestTaskWaitSeconds); } @@ -141,19 +141,20 @@ void TearDownTask(intptr_t context) chip::DeviceLayer::PlatformMgr().Shutdown(); } -const nlTest sTests[] = { NL_TEST_DEF("CheckCommissionManagerEnhancedWindow", CheckCommissionManagerEnhancedWindow), - NL_TEST_DEF("CheckCommissionManagerBasicWindowOpenClose", CheckCommissionManagerBasicWindowOpenClose), - NL_TEST_DEF("CheckCommissionManagerWindowTimeout", CheckCommissionManagerWindowTimeout), - NL_TEST_SENTINEL() }; +const nlTest sTests[] = { + NL_TEST_DEF("CheckCommissioningWindowManagerEnhancedWindow", CheckCommissioningWindowManagerEnhancedWindow), + NL_TEST_DEF("CheckCommissioningWindowManagerBasicWindowOpenClose", CheckCommissioningWindowManagerBasicWindowOpenClose), + NL_TEST_DEF("CheckCommissioningWindowManagerWindowTimeout", CheckCommissioningWindowManagerWindowTimeout), NL_TEST_SENTINEL() +}; } // namespace -int TestCommissionManager() +int TestCommissioningWindowManager() { // clang-format off nlTestSuite theSuite = { - "CommissionManager", + "CommissioningWindowManager", &sTests[0], nullptr, nullptr @@ -170,4 +171,4 @@ int TestCommissionManager() return (nlTestRunnerStats(&theSuite)); } -CHIP_REGISTER_TEST_SUITE(TestCommissionManager) +CHIP_REGISTER_TEST_SUITE(TestCommissioningWindowManager) diff --git a/src/controller/CHIPDeviceController.cpp b/src/controller/CHIPDeviceController.cpp index 25f8a2102d30c8..87ec792bf8d5ec 100644 --- a/src/controller/CHIPDeviceController.cpp +++ b/src/controller/CHIPDeviceController.cpp @@ -830,8 +830,6 @@ CHIP_ERROR DeviceCommissioner::PairDevice(NodeId remoteDeviceId, RendezvousParam err = InitializePairedDeviceList(); SuccessOrExit(err); - params.SetAdvertisementDelegate(&mRendezvousAdvDelegate); - // TODO: We need to specify the peer address for BLE transport in bindings. if (params.GetPeerAddress().GetTransportType() == Transport::Type::kBle || params.GetPeerAddress().GetTransportType() == Transport::Type::kUndefined) @@ -1125,9 +1123,6 @@ void DeviceCommissioner::FreeRendezvousSession() void DeviceCommissioner::RendezvousCleanup(CHIP_ERROR status) { - mRendezvousAdvDelegate.StopAdvertisement(); - mRendezvousAdvDelegate.RendezvousComplete(); - FreeRendezvousSession(); // TODO: make mStorageDelegate mandatory once all controller applications implement the interface. diff --git a/src/controller/CHIPDeviceController.h b/src/controller/CHIPDeviceController.h index a549a01d758844..efd164463d3bdb 100644 --- a/src/controller/CHIPDeviceController.h +++ b/src/controller/CHIPDeviceController.h @@ -356,27 +356,6 @@ class DLL_EXPORT DeviceController : public Messaging::ExchangeDelegate, CHIP_ERROR ProcessControllerNOCChain(const ControllerInitParams & params); }; -/** - * @brief - * The commissioner applications doesn't advertise itself as an available device for rendezvous - * process. This delegate class provides no-op functions for the advertisement delegate. - */ -class DeviceCommissionerRendezvousAdvertisementDelegate : public RendezvousAdvertisementDelegate -{ -public: - /** - * @brief - * Starts advertisement of the device for rendezvous availability. - */ - CHIP_ERROR StartAdvertisement() override { return CHIP_NO_ERROR; } - - /** - * @brief - * Stops advertisement of the device for rendezvous availability. - */ - CHIP_ERROR StopAdvertisement() override { return CHIP_NO_ERROR; } -}; - /** * @brief * The commissioner applications can use this class to pair new/unpaired CHIP devices. The application is @@ -606,8 +585,6 @@ class DLL_EXPORT DeviceCommissioner : public DeviceController, CommissioningStage mCommissioningStage = CommissioningStage::kSecurePairing; - DeviceCommissionerRendezvousAdvertisementDelegate mRendezvousAdvDelegate; - #if CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY // make this commissioner discoverable UserDirectedCommissioningServer * mUdcServer = nullptr; // mUdcTransportMgr is for insecure communication (ex. user directed commissioning) diff --git a/src/protocols/secure_channel/RendezvousParameters.h b/src/protocols/secure_channel/RendezvousParameters.h index 6dfab892b5fa24..4f13d4f6e24890 100644 --- a/src/protocols/secure_channel/RendezvousParameters.h +++ b/src/protocols/secure_channel/RendezvousParameters.h @@ -31,21 +31,6 @@ namespace chip { // The largest supported value for Rendezvous discriminators const uint16_t kMaxRendezvousDiscriminatorValue = 0xFFF; -class DLL_EXPORT RendezvousAdvertisementDelegate -{ -public: - /// called to start advertising that rendezvous is possible (commisioning available) - virtual CHIP_ERROR StartAdvertisement() { return CHIP_ERROR_NOT_IMPLEMENTED; } - - /// called when advertisement is not needed for Rendezvous (e.g. got a BLE connection) - virtual CHIP_ERROR StopAdvertisement() { return CHIP_ERROR_NOT_IMPLEMENTED; } - - /// Called when a rendezvous operation is complete - virtual void RendezvousComplete() {} - - virtual ~RendezvousAdvertisementDelegate() {} -}; - class RendezvousParameters { public: @@ -111,16 +96,6 @@ class RendezvousParameters return *this; } - bool HasAdvertisementDelegate() const { return mAdvDelegate != nullptr; } - - RendezvousAdvertisementDelegate * GetAdvertisementDelegate() const { return mAdvDelegate; } - - RendezvousParameters & SetAdvertisementDelegate(RendezvousAdvertisementDelegate * delegate) - { - mAdvDelegate = delegate; - return *this; - } - #if CONFIG_NETWORK_LAYER_BLE bool HasBleLayer() const { return mBleLayer != nullptr; } Ble::BleLayer * GetBleLayer() const { return mBleLayer; } @@ -152,8 +127,6 @@ class RendezvousParameters PASEVerifier mPASEVerifier; bool mHasPASEVerifier = false; - RendezvousAdvertisementDelegate * mAdvDelegate = nullptr; - #if CONFIG_NETWORK_LAYER_BLE Ble::BleLayer * mBleLayer = nullptr; BLE_CONNECTION_OBJECT mConnectionObject = 0;