From cab67baa845e3465f81f0d4a10e3a5fba5ae58aa Mon Sep 17 00:00:00 2001 From: chrisdecenzo <61757564+chrisdecenzo@users.noreply.github.com> Date: Wed, 18 May 2022 10:08:52 -0700 Subject: [PATCH] Address Rotating ID issues (#18514) * 4224 Rotating ID issues * fix CI build when rotating id disabled * missed comment cleanup * incorporate feedback --- .../tv-casting-common/include/CastingServer.h | 2 +- .../tv-casting-common/src/CastingServer.cpp | 15 +++++++++++++++ .../CommissionerDiscoveryController.cpp | 9 +++++++-- src/include/platform/ConfigurationManager.h | 1 + .../internal/GenericConfigurationManagerImpl.h | 2 ++ .../GenericConfigurationManagerImpl.ipp | 18 ++++++++++++------ 6 files changed, 38 insertions(+), 9 deletions(-) diff --git a/examples/tv-casting-app/tv-casting-common/include/CastingServer.h b/examples/tv-casting-app/tv-casting-common/include/CastingServer.h index 15128a1a92ae4c..b9df701bbd9f34 100644 --- a/examples/tv-casting-app/tv-casting-common/include/CastingServer.h +++ b/examples/tv-casting-app/tv-casting-common/include/CastingServer.h @@ -74,7 +74,7 @@ class CastingServer private: static CastingServer * castingServer_; - CastingServer() {} + CastingServer(); bool mInited = false; TargetVideoPlayerInfo mTargetVideoPlayerInfo; diff --git a/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp b/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp index ef93551675ebec..0b0870517c4df9 100644 --- a/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp +++ b/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp @@ -25,6 +25,21 @@ using namespace chip::app::Clusters::ContentLauncher::Commands; CastingServer * CastingServer::castingServer_ = nullptr; +CastingServer::CastingServer() +{ +#if CHIP_ENABLE_ROTATING_DEVICE_ID && defined(CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID) + // generate and set a random uniqueId for generating rotatingId + uint8_t rotatingDeviceIdUniqueId[chip::DeviceLayer::ConfigurationManager::kRotatingDeviceIDUniqueIDLength]; + for (size_t i = 0; i < sizeof(rotatingDeviceIdUniqueId); i++) + { + rotatingDeviceIdUniqueId[i] = chip::Crypto::GetRandU8(); + } + + ByteSpan rotatingDeviceIdUniqueIdSpan(rotatingDeviceIdUniqueId); + chip::DeviceLayer::ConfigurationMgr().SetRotatingDeviceIdUniqueId(rotatingDeviceIdUniqueIdSpan); +#endif // CHIP_ENABLE_ROTATING_DEVICE_ID && defined(CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID) +} + CastingServer * CastingServer::GetInstance() { if (castingServer_ == nullptr) diff --git a/src/controller/CommissionerDiscoveryController.cpp b/src/controller/CommissionerDiscoveryController.cpp index 92755051e90909..50ce140ecd2a9f 100644 --- a/src/controller/CommissionerDiscoveryController.cpp +++ b/src/controller/CommissionerDiscoveryController.cpp @@ -27,6 +27,7 @@ */ #include #include +#include #if CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY @@ -52,11 +53,15 @@ void CommissionerDiscoveryController::OnUserDirectedCommissioningRequest(UDCClie mReady = false; strncpy(mCurrentInstance, state.GetInstanceName(), sizeof(mCurrentInstance)); mPendingConsent = true; + char rotatingDeviceIdHexBuffer[RotatingDeviceId::kHexMaxLength]; + Encoding::BytesToUppercaseHexString(state.GetRotatingId(), state.GetRotatingIdLength(), rotatingDeviceIdHexBuffer, + RotatingDeviceId::kHexMaxLength); + ChipLogDetail(Controller, "------PROMPT USER: %s is requesting permission to cast to this TV, approve? [" ChipLogFormatMEI - "," ChipLogFormatMEI ",%s]", + "," ChipLogFormatMEI ",%s,%s]", state.GetDeviceName(), ChipLogValueMEI(state.GetVendorId()), ChipLogValueMEI(state.GetProductId()), - state.GetInstanceName()); + state.GetInstanceName(), rotatingDeviceIdHexBuffer); if (mUserPrompter != nullptr) { mUserPrompter->PromptForCommissionOKPermission(state.GetVendorId(), state.GetProductId(), state.GetDeviceName()); diff --git a/src/include/platform/ConfigurationManager.h b/src/include/platform/ConfigurationManager.h index 7816b80ff6ea86..027e0a547d2311 100644 --- a/src/include/platform/ConfigurationManager.h +++ b/src/include/platform/ConfigurationManager.h @@ -105,6 +105,7 @@ class ConfigurationManager // Unique ID is identifier utilized for the rotating device ID calculation purpose as an input key. It is separate identifier // from the Basic cluster unique ID. virtual CHIP_ERROR GetRotatingDeviceIdUniqueId(MutableByteSpan & uniqueIdSpan) = 0; + virtual CHIP_ERROR SetRotatingDeviceIdUniqueId(const ByteSpan & uniqueIdSpan) = 0; #endif virtual CHIP_ERROR GetRegulatoryLocation(uint8_t & location) = 0; virtual CHIP_ERROR GetCountryCode(char * buf, size_t bufSize, size_t & codeLen) = 0; diff --git a/src/include/platform/internal/GenericConfigurationManagerImpl.h b/src/include/platform/internal/GenericConfigurationManagerImpl.h index 27d9a8d918bbc7..e42386d28f48bd 100644 --- a/src/include/platform/internal/GenericConfigurationManagerImpl.h +++ b/src/include/platform/internal/GenericConfigurationManagerImpl.h @@ -80,6 +80,7 @@ class GenericConfigurationManagerImpl : public ConfigurationManager CHIP_ERROR GetLifetimeCounter(uint16_t & lifetimeCounter) override; CHIP_ERROR IncrementLifetimeCounter() override; CHIP_ERROR GetRotatingDeviceIdUniqueId(MutableByteSpan & uniqueIdSpan) override; + CHIP_ERROR SetRotatingDeviceIdUniqueId(const ByteSpan & uniqueIdSpan) override; #endif CHIP_ERROR GetFailSafeArmed(bool & val) override; CHIP_ERROR SetFailSafeArmed(bool val) override; @@ -123,6 +124,7 @@ class GenericConfigurationManagerImpl : public ConfigurationManager protected: #if CHIP_ENABLE_ROTATING_DEVICE_ID && defined(CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID) chip::LifetimePersistedCounter mLifetimePersistedCounter; + uint8_t mRotatingDeviceIdUniqueId[kRotatingDeviceIDUniqueIDLength] = CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID; #endif #if CHIP_USE_TRANSITIONAL_COMMISSIONABLE_DATA_PROVIDER diff --git a/src/include/platform/internal/GenericConfigurationManagerImpl.ipp b/src/include/platform/internal/GenericConfigurationManagerImpl.ipp index 11b368dbd81f3c..eb10c2a46d46ea 100644 --- a/src/include/platform/internal/GenericConfigurationManagerImpl.ipp +++ b/src/include/platform/internal/GenericConfigurationManagerImpl.ipp @@ -638,17 +638,23 @@ CHIP_ERROR GenericConfigurationManagerImpl::IncrementLifetimeCounte return mLifetimePersistedCounter.Advance(); } +template +CHIP_ERROR GenericConfigurationManagerImpl::SetRotatingDeviceIdUniqueId(const ByteSpan & uniqueIdSpan) +{ + ReturnErrorCodeIf(uniqueIdSpan.size() != kRotatingDeviceIDUniqueIDLength, CHIP_ERROR_BUFFER_TOO_SMALL); + memcpy(mRotatingDeviceIdUniqueId, uniqueIdSpan.data(), kRotatingDeviceIDUniqueIDLength); + return CHIP_NO_ERROR; +} + template CHIP_ERROR GenericConfigurationManagerImpl::GetRotatingDeviceIdUniqueId(MutableByteSpan & uniqueIdSpan) { static_assert(kRotatingDeviceIDUniqueIDLength >= kMinRotatingDeviceIDUniqueIDLength, "Length of unique ID for rotating device ID is smaller than minimum."); - constexpr uint8_t uniqueId[] = CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID; - - ReturnErrorCodeIf(sizeof(uniqueId) > uniqueIdSpan.size(), CHIP_ERROR_BUFFER_TOO_SMALL); - ReturnErrorCodeIf(sizeof(uniqueId) != kRotatingDeviceIDUniqueIDLength, CHIP_ERROR_BUFFER_TOO_SMALL); - memcpy(uniqueIdSpan.data(), uniqueId, sizeof(uniqueId)); - uniqueIdSpan = uniqueIdSpan.SubSpan(0, sizeof(uniqueId)); + ReturnErrorCodeIf(sizeof(mRotatingDeviceIdUniqueId) > uniqueIdSpan.size(), CHIP_ERROR_BUFFER_TOO_SMALL); + ReturnErrorCodeIf(sizeof(mRotatingDeviceIdUniqueId) != kRotatingDeviceIDUniqueIDLength, CHIP_ERROR_BUFFER_TOO_SMALL); + memcpy(uniqueIdSpan.data(), mRotatingDeviceIdUniqueId, sizeof(mRotatingDeviceIdUniqueId)); + uniqueIdSpan = uniqueIdSpan.SubSpan(0, sizeof(mRotatingDeviceIdUniqueId)); return CHIP_NO_ERROR; } #endif // CHIP_ENABLE_ROTATING_DEVICE_ID