[nrfconnect] Fix BLE random static address generation (#13218)
diff --git a/config/nrfconnect/app/overlay-bt_private_addresses.conf b/config/nrfconnect/app/overlay-bt_private_addresses.conf
deleted file mode 100644
index 348efd6..0000000
--- a/config/nrfconnect/app/overlay-bt_private_addresses.conf
+++ /dev/null
@@ -1,22 +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.
-#
-
-CONFIG_BT_SMP=y
-CONFIG_BT_PRIVACY=y
-CONFIG_BT_MAX_PAIRED=0
-CONFIG_BT_BONDABLE=n
-CONFIG_BT_TINYCRYPT_ECC=n
-CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY=y
diff --git a/examples/lighting-app/nrfconnect/CMakeLists.txt b/examples/lighting-app/nrfconnect/CMakeLists.txt
index b5de67c..718ed19 100644
--- a/examples/lighting-app/nrfconnect/CMakeLists.txt
+++ b/examples/lighting-app/nrfconnect/CMakeLists.txt
@@ -30,11 +30,6 @@
list(APPEND CONF_FILE boards/${BOARD}.conf)
endif()
-# TODO: temporary fix to remove after solving static addressing problem on nrf5340
-if(BOARD STREQUAL "nrf5340dk_nrf5340_cpuapp")
- list(INSERT OVERLAY_CONFIG 0 ${CHIP_ROOT}/config/nrfconnect/app/overlay-bt_private_addresses.conf)
-endif()
-
option(BUILD_WITH_DFU "Build target with Device Firmware Upgrade support" OFF)
if(BUILD_WITH_DFU)
list(INSERT OVERLAY_CONFIG 0 ${CHIP_ROOT}/config/nrfconnect/app/overlay-ota_requestor.conf)
diff --git a/examples/lock-app/nrfconnect/CMakeLists.txt b/examples/lock-app/nrfconnect/CMakeLists.txt
index f187c19..b2a9f7d 100644
--- a/examples/lock-app/nrfconnect/CMakeLists.txt
+++ b/examples/lock-app/nrfconnect/CMakeLists.txt
@@ -29,11 +29,6 @@
list(APPEND CONF_FILE boards/${BOARD}.conf)
endif()
-# TODO: temporary fix to remove after solving static addressing problem on nrf5340
-if(${BOARD} STREQUAL "nrf5340dk_nrf5340_cpuapp")
- list(INSERT OVERLAY_CONFIG 0 ${CHIP_ROOT}/config/nrfconnect/app/overlay-bt_private_addresses.conf)
-endif()
-
option(BUILD_WITH_DFU "Build target with Device Firmware Upgrade support" OFF)
if(BUILD_WITH_DFU)
if(${BOARD} STREQUAL "nrf5340dk_nrf5340_cpuapp")
diff --git a/examples/pump-app/nrfconnect/CMakeLists.txt b/examples/pump-app/nrfconnect/CMakeLists.txt
index e9f8574..2fb43b9 100644
--- a/examples/pump-app/nrfconnect/CMakeLists.txt
+++ b/examples/pump-app/nrfconnect/CMakeLists.txt
@@ -29,11 +29,6 @@
list(APPEND CONF_FILE boards/${BOARD}.conf)
endif()
-# TODO: temporary fix to remove after solving static addressing problem on nrf5340
-if(${BOARD} STREQUAL "nrf5340dk_nrf5340_cpuapp")
- list(INSERT OVERLAY_CONFIG 0 ${CHIP_ROOT}/config/nrfconnect/app/overlay-bt_private_addresses.conf)
-endif()
-
option(BUILD_WITH_DFU "Build target with Device Firmware Upgrade support" OFF)
if(BUILD_WITH_DFU)
if(${BOARD} STREQUAL "nrf5340dk_nrf5340_cpuapp")
diff --git a/examples/pump-controller-app/nrfconnect/CMakeLists.txt b/examples/pump-controller-app/nrfconnect/CMakeLists.txt
index bb5e231..ca973b4 100644
--- a/examples/pump-controller-app/nrfconnect/CMakeLists.txt
+++ b/examples/pump-controller-app/nrfconnect/CMakeLists.txt
@@ -29,11 +29,6 @@
list(APPEND CONF_FILE boards/${BOARD}.conf)
endif()
-# TODO: temporary fix to remove after solving static addressing problem on nrf5340
-if(${BOARD} STREQUAL "nrf5340dk_nrf5340_cpuapp")
- list(INSERT OVERLAY_CONFIG 0 ${CHIP_ROOT}/config/nrfconnect/app/overlay-bt_private_addresses.conf)
-endif()
-
option(BUILD_WITH_DFU "Build target with Device Firmware Upgrade support" OFF)
if(BUILD_WITH_DFU)
if(${BOARD} STREQUAL "nrf5340dk_nrf5340_cpuapp")
diff --git a/src/platform/Zephyr/BLEManagerImpl.cpp b/src/platform/Zephyr/BLEManagerImpl.cpp
index 5233148..e7b99e7 100644
--- a/src/platform/Zephyr/BLEManagerImpl.cpp
+++ b/src/platform/Zephyr/BLEManagerImpl.cpp
@@ -35,6 +35,7 @@
#include <bluetooth/addr.h>
#include <bluetooth/gatt.h>
#include <logging/log.h>
+#include <random/rand32.h>
#include <sys/byteorder.h>
#include <sys/util.h>
@@ -85,22 +86,40 @@
// This value should be adjusted accordingly if the service declaration changes.
constexpr int kCHIPoBLE_CCC_AttributeIndex = 3;
-void InitRandomStaticAddress()
+CHIP_ERROR InitRandomStaticAddress()
{
-#if !CONFIG_BT_PRIVACY
- // When the BT privacy feature is disabled, generate a random static address once per boot.
- // This must be done before bt_enable() has been called.
+ // Generate a random static address for the default identity.
+ // This must be done before bt_enable() as after that updating the default identity is not possible.
+ int error = 0;
bt_addr_le_t addr;
- int error = bt_addr_le_create_static(&addr);
- VerifyOrReturn(error == 0, ChipLogError(DeviceLayer, "Failed to create BLE address: %d", error));
+#if CONFIG_BT_HOST_CRYPTO
+ // When CONFIG_BT_HOST_CRYPTO is enabled, bt_addr_le_create_static() depends on HCI transport
+ // which is not yet started at this point, so use a different method for generating the address
+ addr.type = BT_ADDR_LE_RANDOM;
+ error = sys_csrand_get(addr.a.val, sizeof(addr.a.val));
+ BT_ADDR_SET_STATIC(&addr.a);
+#else
+ error = bt_addr_le_create_static(&addr);
+#endif
+
+ if (error)
+ {
+ ChipLogError(DeviceLayer, "Failed to create BLE address: %d", error);
+ return System::MapErrorZephyr(error);
+ }
error = bt_id_create(&addr, nullptr);
- VerifyOrReturn(error == 0, ChipLogError(DeviceLayer, "Failed to create BLE identity: %d", error));
- ChipLogProgress(DeviceLayer, "BLE address was set to %02X:%02X:%02X:%02X:%02X:%02X", addr.a.val[5], addr.a.val[4],
- addr.a.val[3], addr.a.val[2], addr.a.val[1], addr.a.val[0]);
-#endif
+ if (error)
+ {
+ ChipLogError(DeviceLayer, "Failed to create BLE identity: %d", error);
+ return System::MapErrorZephyr(error);
+ }
+
+ ChipLogProgress(DeviceLayer, "BLE address: %02X:%02X:%02X:%02X:%02X:%02X", addr.a.val[5], addr.a.val[4], addr.a.val[3],
+ addr.a.val[2], addr.a.val[1], addr.a.val[0]);
+ return CHIP_NO_ERROR;
}
} // unnamed namespace
@@ -116,7 +135,7 @@
memset(mSubscribedConns, 0, sizeof(mSubscribedConns));
- InitRandomStaticAddress();
+ ReturnErrorOnFailure(InitRandomStaticAddress());
int err = bt_enable(NULL);
VerifyOrReturnError(err == 0, MapErrorZephyr(err));