From bab40deb8fa7ecdd1b0f27bce5b58de01e186b00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arkadiusz=20Ba=C5=82ys?= Date: Tue, 25 Apr 2023 17:25:52 +0200 Subject: [PATCH] [nrfconnect] Repair Rotating Device ID UID parsing (#26179) Rotating Device Id Unique Id was parsing wrongly in nrfconnect's factory data provider implementation. There was also a problem, that testing Rotating Device Id UID was not being provided by Zephyr's Kconfig. Repaired the factory_data build for nRFconnect devices. --- .../nrfconnect/main/AppTask.cpp | 1 + .../nrfconnect/main/include/AppTask.h | 2 + .../nrfconnect/main/AppTask.cpp | 1 + .../nrfconnect/main/include/AppTask.h | 2 + .../nrfconnect/main/AppTask.cpp | 1 + .../nrfconnect/main/include/AppTask.h | 2 + .../lighting-app/nrfconnect/main/AppTask.cpp | 1 + .../nrfconnect/main/include/AppTask.h | 2 + examples/lock-app/nrfconnect/main/AppTask.cpp | 1 + .../nrfconnect/main/include/AppTask.h | 2 + examples/pump-app/nrfconnect/main/AppTask.cpp | 1 + .../nrfconnect/main/include/AppTask.h | 2 + .../nrfconnect/main/AppTask.cpp | 1 + .../nrfconnect/main/include/AppTask.h | 2 + .../window-app/nrfconnect/main/AppTask.cpp | 1 + .../nrfconnect/main/include/AppTask.h | 2 + src/platform/nrfconnect/BUILD.gn | 5 ++ .../DeviceInstanceInfoProviderImpl.cpp | 47 +++++++++++++++++++ .../DeviceInstanceInfoProviderImpl.h | 43 +++++++++++++++++ src/platform/nrfconnect/FactoryDataParser.c | 15 +++--- .../nrfconnect/FactoryDataProvider.cpp | 2 +- 21 files changed, 126 insertions(+), 10 deletions(-) create mode 100644 src/platform/nrfconnect/DeviceInstanceInfoProviderImpl.cpp create mode 100644 src/platform/nrfconnect/DeviceInstanceInfoProviderImpl.h diff --git a/examples/all-clusters-app/nrfconnect/main/AppTask.cpp b/examples/all-clusters-app/nrfconnect/main/AppTask.cpp index 0cee0e74ba78c8..05103f4c87f25d 100644 --- a/examples/all-clusters-app/nrfconnect/main/AppTask.cpp +++ b/examples/all-clusters-app/nrfconnect/main/AppTask.cpp @@ -190,6 +190,7 @@ CHIP_ERROR AppTask::Init() memset(sTestEventTriggerEnableKey, 0, sizeof(sTestEventTriggerEnableKey)); } #else + SetDeviceInstanceInfoProvider(&DeviceInstanceInfoProviderMgrImpl()); SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider()); #endif diff --git a/examples/all-clusters-app/nrfconnect/main/include/AppTask.h b/examples/all-clusters-app/nrfconnect/main/include/AppTask.h index a369eeefe55c6b..4b57d1dc3f249c 100644 --- a/examples/all-clusters-app/nrfconnect/main/include/AppTask.h +++ b/examples/all-clusters-app/nrfconnect/main/include/AppTask.h @@ -24,6 +24,8 @@ #if CONFIG_CHIP_FACTORY_DATA #include +#else +#include #endif #ifdef CONFIG_MCUMGR_SMP_BT diff --git a/examples/all-clusters-minimal-app/nrfconnect/main/AppTask.cpp b/examples/all-clusters-minimal-app/nrfconnect/main/AppTask.cpp index fc565a94d1c12f..19ce36436419b3 100644 --- a/examples/all-clusters-minimal-app/nrfconnect/main/AppTask.cpp +++ b/examples/all-clusters-minimal-app/nrfconnect/main/AppTask.cpp @@ -144,6 +144,7 @@ CHIP_ERROR AppTask::Init() SetDeviceAttestationCredentialsProvider(&mFactoryDataProvider); SetCommissionableDataProvider(&mFactoryDataProvider); #else + SetDeviceInstanceInfoProvider(&DeviceInstanceInfoProviderMgrImpl()); SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider()); #endif diff --git a/examples/all-clusters-minimal-app/nrfconnect/main/include/AppTask.h b/examples/all-clusters-minimal-app/nrfconnect/main/include/AppTask.h index 1a6922e9286f0d..9921de58383521 100644 --- a/examples/all-clusters-minimal-app/nrfconnect/main/include/AppTask.h +++ b/examples/all-clusters-minimal-app/nrfconnect/main/include/AppTask.h @@ -24,6 +24,8 @@ #if CONFIG_CHIP_FACTORY_DATA #include +#else +#include #endif #ifdef CONFIG_MCUMGR_SMP_BT diff --git a/examples/light-switch-app/nrfconnect/main/AppTask.cpp b/examples/light-switch-app/nrfconnect/main/AppTask.cpp index 4419f8615be960..e77184a6a6c355 100644 --- a/examples/light-switch-app/nrfconnect/main/AppTask.cpp +++ b/examples/light-switch-app/nrfconnect/main/AppTask.cpp @@ -208,6 +208,7 @@ CHIP_ERROR AppTask::Init() memset(sTestEventTriggerEnableKey, 0, sizeof(sTestEventTriggerEnableKey)); } #else + SetDeviceInstanceInfoProvider(&DeviceInstanceInfoProviderMgrImpl()); SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider()); #endif diff --git a/examples/light-switch-app/nrfconnect/main/include/AppTask.h b/examples/light-switch-app/nrfconnect/main/include/AppTask.h index 4e0a264af03667..a40c5e82bfd51f 100644 --- a/examples/light-switch-app/nrfconnect/main/include/AppTask.h +++ b/examples/light-switch-app/nrfconnect/main/include/AppTask.h @@ -25,6 +25,8 @@ #if CONFIG_CHIP_FACTORY_DATA #include +#else +#include #endif #ifdef CONFIG_MCUMGR_SMP_BT diff --git a/examples/lighting-app/nrfconnect/main/AppTask.cpp b/examples/lighting-app/nrfconnect/main/AppTask.cpp index 485d000d5cfb75..3b4d1a020de535 100644 --- a/examples/lighting-app/nrfconnect/main/AppTask.cpp +++ b/examples/lighting-app/nrfconnect/main/AppTask.cpp @@ -232,6 +232,7 @@ CHIP_ERROR AppTask::Init() memset(sTestEventTriggerEnableKey, 0, sizeof(sTestEventTriggerEnableKey)); } #else + SetDeviceInstanceInfoProvider(&DeviceInstanceInfoProviderMgrImpl()); SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider()); #endif diff --git a/examples/lighting-app/nrfconnect/main/include/AppTask.h b/examples/lighting-app/nrfconnect/main/include/AppTask.h index 874be7d759b5a8..51df03f650c530 100644 --- a/examples/lighting-app/nrfconnect/main/include/AppTask.h +++ b/examples/lighting-app/nrfconnect/main/include/AppTask.h @@ -26,6 +26,8 @@ #if CONFIG_CHIP_FACTORY_DATA #include +#else +#include #endif #ifdef CONFIG_CHIP_PW_RPC diff --git a/examples/lock-app/nrfconnect/main/AppTask.cpp b/examples/lock-app/nrfconnect/main/AppTask.cpp index 61b96e266e6038..9e59b86fcdcc4e 100644 --- a/examples/lock-app/nrfconnect/main/AppTask.cpp +++ b/examples/lock-app/nrfconnect/main/AppTask.cpp @@ -202,6 +202,7 @@ CHIP_ERROR AppTask::Init() memset(sTestEventTriggerEnableKey, 0, sizeof(sTestEventTriggerEnableKey)); } #else + SetDeviceInstanceInfoProvider(&DeviceInstanceInfoProviderMgrImpl()); SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider()); #endif diff --git a/examples/lock-app/nrfconnect/main/include/AppTask.h b/examples/lock-app/nrfconnect/main/include/AppTask.h index 402752d6412738..76738ac9afd331 100644 --- a/examples/lock-app/nrfconnect/main/include/AppTask.h +++ b/examples/lock-app/nrfconnect/main/include/AppTask.h @@ -27,6 +27,8 @@ #if CONFIG_CHIP_FACTORY_DATA #include +#else +#include #endif #ifdef CONFIG_MCUMGR_SMP_BT diff --git a/examples/pump-app/nrfconnect/main/AppTask.cpp b/examples/pump-app/nrfconnect/main/AppTask.cpp index 94a7088dbc7644..1a45d22444af03 100644 --- a/examples/pump-app/nrfconnect/main/AppTask.cpp +++ b/examples/pump-app/nrfconnect/main/AppTask.cpp @@ -175,6 +175,7 @@ CHIP_ERROR AppTask::Init() memset(sTestEventTriggerEnableKey, 0, sizeof(sTestEventTriggerEnableKey)); } #else + SetDeviceInstanceInfoProvider(&DeviceInstanceInfoProviderMgrImpl()); SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider()); #endif diff --git a/examples/pump-app/nrfconnect/main/include/AppTask.h b/examples/pump-app/nrfconnect/main/include/AppTask.h index a534482c2b7c87..bcf2d1eaf20dad 100644 --- a/examples/pump-app/nrfconnect/main/include/AppTask.h +++ b/examples/pump-app/nrfconnect/main/include/AppTask.h @@ -27,6 +27,8 @@ #if CONFIG_CHIP_FACTORY_DATA #include +#else +#include #endif #ifdef CONFIG_MCUMGR_SMP_BT diff --git a/examples/pump-controller-app/nrfconnect/main/AppTask.cpp b/examples/pump-controller-app/nrfconnect/main/AppTask.cpp index b97b11eabc1baf..6a8954c121f0e1 100644 --- a/examples/pump-controller-app/nrfconnect/main/AppTask.cpp +++ b/examples/pump-controller-app/nrfconnect/main/AppTask.cpp @@ -173,6 +173,7 @@ CHIP_ERROR AppTask::Init() memset(sTestEventTriggerEnableKey, 0, sizeof(sTestEventTriggerEnableKey)); } #else + SetDeviceInstanceInfoProvider(&DeviceInstanceInfoProviderMgrImpl()); SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider()); #endif diff --git a/examples/pump-controller-app/nrfconnect/main/include/AppTask.h b/examples/pump-controller-app/nrfconnect/main/include/AppTask.h index 742923f106a195..02e7f0a5320d12 100644 --- a/examples/pump-controller-app/nrfconnect/main/include/AppTask.h +++ b/examples/pump-controller-app/nrfconnect/main/include/AppTask.h @@ -27,6 +27,8 @@ #if CONFIG_CHIP_FACTORY_DATA #include +#else +#include #endif #ifdef CONFIG_MCUMGR_SMP_BT diff --git a/examples/window-app/nrfconnect/main/AppTask.cpp b/examples/window-app/nrfconnect/main/AppTask.cpp index b0b3886a0a802f..280f63316a669c 100644 --- a/examples/window-app/nrfconnect/main/AppTask.cpp +++ b/examples/window-app/nrfconnect/main/AppTask.cpp @@ -179,6 +179,7 @@ CHIP_ERROR AppTask::Init() memset(sTestEventTriggerEnableKey, 0, sizeof(sTestEventTriggerEnableKey)); } #else + SetDeviceInstanceInfoProvider(&DeviceInstanceInfoProviderMgrImpl()); SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider()); #endif diff --git a/examples/window-app/nrfconnect/main/include/AppTask.h b/examples/window-app/nrfconnect/main/include/AppTask.h index 4d134a791fa8fd..28a7331d9737ba 100644 --- a/examples/window-app/nrfconnect/main/include/AppTask.h +++ b/examples/window-app/nrfconnect/main/include/AppTask.h @@ -24,6 +24,8 @@ #if CONFIG_CHIP_FACTORY_DATA #include +#else +#include #endif #ifdef CONFIG_MCUMGR_SMP_BT diff --git a/src/platform/nrfconnect/BUILD.gn b/src/platform/nrfconnect/BUILD.gn index 40c6f8cac3d292..1efcadfa9fe82e 100644 --- a/src/platform/nrfconnect/BUILD.gn +++ b/src/platform/nrfconnect/BUILD.gn @@ -69,6 +69,11 @@ static_library("nrfconnect") { "FactoryDataProvider.cpp", "FactoryDataProvider.h", ] + } else { + sources += [ + "DeviceInstanceInfoProviderImpl.cpp", + "DeviceInstanceInfoProviderImpl.h", + ] } if (chip_enable_openthread) { diff --git a/src/platform/nrfconnect/DeviceInstanceInfoProviderImpl.cpp b/src/platform/nrfconnect/DeviceInstanceInfoProviderImpl.cpp new file mode 100644 index 00000000000000..ed4f2124edf754 --- /dev/null +++ b/src/platform/nrfconnect/DeviceInstanceInfoProviderImpl.cpp @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2022 Project CHIP Authors + * All rights reserved. + * + * 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 "DeviceInstanceInfoProviderImpl.h" +#include + +namespace chip { +namespace DeviceLayer { + +CHIP_ERROR DeviceInstanceInfoProviderImpl::GetRotatingDeviceIdUniqueId(MutableByteSpan & uniqueIdSpan) +{ +#if CHIP_ENABLE_ROTATING_DEVICE_ID && defined(CONFIG_CHIP_DEVICE_ROTATING_DEVICE_UID) + static_assert(ConfigurationManager::kRotatingDeviceIDUniqueIDLength >= ConfigurationManager::kMinRotatingDeviceIDUniqueIDLength, + "Length of unique ID for rotating device ID is smaller than minimum."); + + ReturnErrorCodeIf(ConfigurationManager::kRotatingDeviceIDUniqueIDLength > uniqueIdSpan.size(), CHIP_ERROR_BUFFER_TOO_SMALL); + + size_t bytesLen = chip::Encoding::HexToBytes(CONFIG_CHIP_DEVICE_ROTATING_DEVICE_UID, + ConfigurationManager::kRotatingDeviceIDUniqueIDLength * 2, uniqueIdSpan.data(), + uniqueIdSpan.size()); + + ReturnErrorCodeIf(bytesLen != ConfigurationManager::kRotatingDeviceIDUniqueIDLength, CHIP_ERROR_INVALID_STRING_LENGTH); + uniqueIdSpan.reduce_size(bytesLen); + + return CHIP_NO_ERROR; +#endif // CHIP_ENABLE_ROTATING_DEVICE_ID + + return CHIP_ERROR_NOT_IMPLEMENTED; +} + +} // namespace DeviceLayer +} // namespace chip diff --git a/src/platform/nrfconnect/DeviceInstanceInfoProviderImpl.h b/src/platform/nrfconnect/DeviceInstanceInfoProviderImpl.h new file mode 100644 index 00000000000000..1489f2810b4170 --- /dev/null +++ b/src/platform/nrfconnect/DeviceInstanceInfoProviderImpl.h @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2023 Project CHIP Authors + * All rights reserved. + * + * 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 + +namespace chip { +namespace DeviceLayer { + +class DeviceInstanceInfoProviderImpl : public Internal::GenericDeviceInstanceInfoProvider +{ +public: + CHIP_ERROR GetRotatingDeviceIdUniqueId(MutableByteSpan & uniqueIdSpan) override; + + DeviceInstanceInfoProviderImpl(ConfigurationManagerImpl & configManager) : + Internal::GenericDeviceInstanceInfoProvider(configManager) + {} +}; + +inline DeviceInstanceInfoProviderImpl & DeviceInstanceInfoProviderMgrImpl() +{ + static DeviceInstanceInfoProviderImpl sInstance(ConfigurationManagerImpl::GetDefaultInstance()); + return sInstance; +} +} // namespace DeviceLayer +} // namespace chip diff --git a/src/platform/nrfconnect/FactoryDataParser.c b/src/platform/nrfconnect/FactoryDataParser.c index 85caee5f9ac6b2..56da5343d973dc 100644 --- a/src/platform/nrfconnect/FactoryDataParser.c +++ b/src/platform/nrfconnect/FactoryDataParser.c @@ -18,15 +18,12 @@ #include "FactoryDataParser.h" #include -#include #include #include #define MAX_FACTORY_DATA_NESTING_LEVEL 3 -LOG_MODULE_DECLARE(app, CONFIG_MATTER_LOG_LEVEL); - static inline bool uint16_decode(zcbor_state_t * states, uint16_t * value) { uint32_t u32; @@ -174,14 +171,14 @@ bool ParseFactoryData(uint8_t * buffer, uint16_t bufferSize, struct FactoryData isdigit(date.value[3]) && date.value[4] == '-' && isdigit(date.value[5]) && isdigit(date.value[6]) && date.value[7] == '-' && isdigit(date.value[8]) && isdigit(date.value[9])) { - factoryData->date_year = - 1000 * (date.value[0] - '0') + 100 * (date.value[1] - '0') + 10 * (date.value[2] - '0') + date.value[3] - '0'; - factoryData->date_month = 10 * (date.value[5] - '0') + date.value[6] - '0'; - factoryData->date_day = 10 * (date.value[8] - '0') + date.value[9] - '0'; + factoryData->date_year = (uint16_t)(1000 * (uint16_t)(date.value[0] - '0') + 100 * (uint16_t)(date.value[1] - '0') + + 10 * (uint16_t)(date.value[2] - '0') + (uint16_t)(date.value[3] - '0')); + factoryData->date_month = (uint8_t)(10 * (uint16_t)(date.value[5] - '0') + (uint16_t)(date.value[6] - '0')); + factoryData->date_day = (uint8_t)(10 * (uint16_t)(date.value[8] - '0') + (uint16_t)(date.value[9] - '0')); } else { - LOG_ERR("Parsing error - wrong date format"); + res = false; } } else if (strncmp("hw_ver_str", (const char *) currentString.value, currentString.len) == 0) @@ -240,7 +237,7 @@ bool ParseFactoryData(uint8_t * buffer, uint16_t bufferSize, struct FactoryData { factoryData->user.data = (void *) states->payload; res = res && zcbor_any_skip(states, NULL); - factoryData->user.len = (void *) states->payload - factoryData->user.data; + factoryData->user.len = (size_t)((void *) states->payload - factoryData->user.data); } else { diff --git a/src/platform/nrfconnect/FactoryDataProvider.cpp b/src/platform/nrfconnect/FactoryDataProvider.cpp index 200b8fac0f33e8..229eb2745d6c91 100644 --- a/src/platform/nrfconnect/FactoryDataProvider.cpp +++ b/src/platform/nrfconnect/FactoryDataProvider.cpp @@ -81,7 +81,7 @@ CHIP_ERROR FactoryDataProvider::Init() return error; } - if (!ParseFactoryData(factoryData, factoryDataSize, &mFactoryData)) + if (!ParseFactoryData(factoryData, static_cast(factoryDataSize), &mFactoryData)) { ChipLogError(DeviceLayer, "Failed to parse factory data"); return CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND;