[Silabs] Added code to random address generation using hardware API's. (#31277)
* Added code to random address generation using hardware API's.
* Made changes as per review comments
* Restyled by clang-format
* Made trng key array constant as per comments.
---------
Co-authored-by: Restyled.io <commits@restyled.io>
diff --git a/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.c b/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.c
index 7655f6b..6e91f2a 100644
--- a/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.c
+++ b/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.c
@@ -52,6 +52,11 @@
#define ADV_MULTIPROBE 1
#define ADV_SCAN_PERIODICITY 10
+#ifdef SIWX_917
+#include "sl_si91x_trng.h"
+#define TRNGKEY_SIZE 4
+#endif // SIWX_917
+
struct wfx_rsi wfx_rsi;
/* Declare a variable to hold the data associated with the created event group. */
@@ -301,6 +306,25 @@
SILABS_LOG("sl_wifi_get_mac_address failed: %x", status);
return status;
}
+#ifdef SIWX_917
+ const uint32_t trngKey[TRNGKEY_SIZE] = { 0x16157E2B, 0xA6D2AE28, 0x8815F7AB, 0x3C4FCF09 };
+
+ // To check the Entropy of TRNG and verify TRNG functioning.
+ status = sl_si91x_trng_entropy();
+ if (status != SL_STATUS_OK)
+ {
+ SILABS_LOG("TRNG Entropy Failed");
+ return status;
+ }
+
+ // Initiate and program the key required for TRNG hardware engine
+ status = sl_si91x_trng_program_key(trngKey, TRNGKEY_SIZE);
+ if (status != SL_STATUS_OK)
+ {
+ SILABS_LOG("TRNG Key Programming Failed");
+ return status;
+ }
+#endif // SIWX_917
wfx_rsi.events = xEventGroupCreateStatic(&rsiDriverEventGroup);
wfx_rsi.dev_state |= WFX_RSI_ST_DEV_READY;
osSemaphoreRelease(sl_rs_ble_init_sem);
diff --git a/src/platform/silabs/rs911x/BLEManagerImpl.cpp b/src/platform/silabs/rs911x/BLEManagerImpl.cpp
index 343acf6..ca0e489 100644
--- a/src/platform/silabs/rs911x/BLEManagerImpl.cpp
+++ b/src/platform/silabs/rs911x/BLEManagerImpl.cpp
@@ -58,6 +58,12 @@
#include <platform/DeviceInstanceInfoProvider.h>
#include <string.h>
+#ifdef SIWX_917
+extern "C" {
+#include "sl_si91x_trng.h"
+}
+#endif // SIWX_917
+
#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
#include <setup_payload/AdditionalDataPayloadGenerator.h>
#endif
@@ -78,8 +84,23 @@
void sl_ble_init()
{
- uint8_t randomAddrBLE[6] = { 0 };
- uint64_t randomAddr = chip::Crypto::GetRandU64();
+ uint8_t randomAddrBLE[RSI_BLE_ADDR_LENGTH] = { 0 };
+#if SIWX_917
+ sl_status_t sl_status;
+ //! Get Random number of desired length
+ sl_status = sl_si91x_trng_get_random_num((uint32_t *) randomAddrBLE, RSI_BLE_ADDR_LENGTH);
+ if (sl_status != SL_STATUS_OK)
+ {
+ ChipLogError(DeviceLayer, " TRNG Random number generation Failed ");
+ return;
+ }
+ // Set the two least significant bits as the first 2 bits of the address has to be '11' to ensure the address is a random
+ // non-resolvable private address
+ randomAddrBLE[5] |= 0xC0;
+#else
+ uint64_t randomAddr = chip::Crypto::GetRandU64();
+ memcpy(randomAddrBLE, &randomAddr, RSI_BLE_ADDR_LENGTH);
+#endif // SIWX_917
// registering the GAP callback functions
rsi_ble_gap_register_callbacks(NULL, NULL, rsi_ble_on_disconnect_event, NULL, NULL, NULL, rsi_ble_on_enhance_conn_status_event,
@@ -93,10 +114,9 @@
// Exchange of GATT info with BLE stack
rsi_ble_add_matter_service();
-
// initializing the application events map
rsi_ble_app_init_events();
- memcpy(randomAddrBLE, &randomAddr, 6);
+
rsi_ble_set_random_address_with_value(randomAddrBLE);
chip::DeviceLayer::Internal::BLEMgrImpl().HandleBootEvent();
}
diff --git a/src/platform/silabs/rs911x/rsi_ble_config.h b/src/platform/silabs/rs911x/rsi_ble_config.h
index 9bc475a..e58cadc 100644
--- a/src/platform/silabs/rs911x/rsi_ble_config.h
+++ b/src/platform/silabs/rs911x/rsi_ble_config.h
@@ -57,6 +57,7 @@
#define RSI_BLE_DEV_NAME "CCP_DEVICE"
#define RSI_BLE_SET_RAND_ADDR "00:23:A7:12:34:56"
#define RSI_BLE_EVENT_GATT_RD (0x08)
+#define RSI_BLE_ADDR_LENGTH 6
#define CLEAR_WHITELIST (0x00)
#define ADD_DEVICE_TO_WHITELIST (0x01)
diff --git a/third_party/silabs/SiWx917_sdk.gni b/third_party/silabs/SiWx917_sdk.gni
index f66011f..5e14a44 100644
--- a/third_party/silabs/SiWx917_sdk.gni
+++ b/third_party/silabs/SiWx917_sdk.gni
@@ -57,6 +57,10 @@
# ble component
"${wifi_sdk_root}/components/device/silabs/si91x/wireless/ble/inc",
+ # trng component
+ "${wifi_sdk_root}/components/device/silabs/si91x/wireless/crypto/inc",
+ "${wifi_sdk_root}/components/device/silabs/si91x/wireless/crypto/trng/inc",
+
# si91x component
"${wifi_sdk_root}/components/device/silabs/si91x/wireless/ahb_interface/inc",
"${wifi_sdk_root}/components/device/silabs/si91x/wireless/inc",
@@ -337,6 +341,7 @@
"${wifi_sdk_root}/components/device/silabs/si91x/wireless/ble/src/rsi_common_apis.c",
"${wifi_sdk_root}/components/device/silabs/si91x/wireless/ble/src/rsi_utils.c",
"${wifi_sdk_root}/components/device/silabs/si91x/wireless/ble/src/sl_si91x_ble.c",
+ "${wifi_sdk_root}/components/device/silabs/si91x/wireless/crypto/trng/src/sl_si91x_trng.c",
# si91x_basic_buffers component
"${wifi_sdk_root}/components/board/silabs/src/rsi_board.c",