Bluetooth: Mesh: add tf-m support for ble mesh

This PR adds ability to build mesh with tf-m psa
for platforms those support tf-m.

Signed-off-by: Aleksandr Khromykh <aleksandr.khromykh@nordicsemi.no>
This commit is contained in:
Aleksandr Khromykh 2023-05-31 14:09:21 +02:00 committed by Carles Cufí
commit 327eb119b6
22 changed files with 132 additions and 12 deletions

View file

@ -12,7 +12,7 @@
#define ZEPHYR_INCLUDE_BLUETOOTH_MESH_KEYS_H_ #define ZEPHYR_INCLUDE_BLUETOOTH_MESH_KEYS_H_
#include <stdint.h> #include <stdint.h>
#if defined CONFIG_BT_MESH_USES_MBEDTLS_PSA #if defined CONFIG_BT_MESH_USES_MBEDTLS_PSA || defined CONFIG_BT_MESH_USES_TFM_PSA
#include <psa/crypto.h> #include <psa/crypto.h>
#endif #endif
@ -20,7 +20,7 @@
extern "C" { extern "C" {
#endif #endif
#if defined CONFIG_BT_MESH_USES_MBEDTLS_PSA #if defined CONFIG_BT_MESH_USES_MBEDTLS_PSA || defined CONFIG_BT_MESH_USES_TFM_PSA
/** The structure that keeps representation of key. */ /** The structure that keeps representation of key. */
struct bt_mesh_key { struct bt_mesh_key {

View file

@ -0,0 +1,33 @@
CONFIG_IPC_SERVICE=y
CONFIG_MBOX=y
CONFIG_HEAP_MEM_POOL_SIZE=8192
CONFIG_MAIN_STACK_SIZE=512
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=512
CONFIG_BT=y
CONFIG_BT_HCI_RAW=y
CONFIG_BT_HCI_RAW_RESERVE=1
CONFIG_BT_MAX_CONN=16
# Workaround: Unable to allocate command buffer when using K_NO_WAIT since
# Host number of completed commands does not follow normal flow control.
CONFIG_BT_BUF_CMD_TX_COUNT=10
# Controller
CONFIG_BT_LL_SW_SPLIT=y
# Disable unused Bluetooth features
CONFIG_BT_CTLR_DUP_FILTER_LEN=0
CONFIG_BT_CTLR_LE_ENC=n
CONFIG_BT_CTLR_LE_PING=n
CONFIG_BT_DATA_LEN_UPDATE=n
CONFIG_BT_PHY_UPDATE=n
CONFIG_BT_CTLR_MIN_USED_CHAN=n
CONFIG_BT_CTLR_PRIVACY=n
CONFIG_BT_OBSERVER=y
CONFIG_BT_BROADCASTER=y
CONFIG_BT_EXT_ADV=y

View file

@ -82,3 +82,10 @@ tests:
platform_allow: nrf5340dk_nrf5340_cpunet platform_allow: nrf5340dk_nrf5340_cpunet
integration_platforms: integration_platforms:
- nrf5340dk_nrf5340_cpunet - nrf5340dk_nrf5340_cpunet
sample.bluetooth.hci_rpmsg.mesh.bt_ll_sw_split:
harness: bluetooth
tags: bluetooth
extra_args: CONF_FILE="nrf5340_cpunet_bt_mesh-bt_ll_sw_split.conf"
platform_allow: nrf5340dk_nrf5340_cpunet
integration_platforms:
- nrf5340dk_nrf5340_cpunet

View file

@ -13,3 +13,9 @@ if (BOARD STREQUAL bbc_microbit)
else() else()
target_sources(app PRIVATE src/board.c) target_sources(app PRIVATE src/board.c)
endif() endif()
if (CONFIG_BUILD_WITH_TFM)
target_include_directories(app PRIVATE
$<TARGET_PROPERTY:tfm,TFM_BINARY_DIR>/install/interface/include
)
endif()

View file

@ -44,6 +44,12 @@ For other boards, build and flash the application as follows:
Refer to your :ref:`board's documentation <boards>` for alternative Refer to your :ref:`board's documentation <boards>` for alternative
flash instructions if your board doesn't support the ``flash`` target. flash instructions if your board doesn't support the ``flash`` target.
To run the application on an :ref:`nrf5340dk_nrf5340`, a Bluetooth controller application
must also run on the network core. The :ref:`bluetooth-hci-rpmsg-sample` sample
application may be used. Build this sample with configuration
:zephyr_file:`samples/bluetooth/hci_rpmg/nrf5340_cpunet_bt_mesh-bt_ll_sw_split.conf`
to enable mesh support.
Interacting with the sample Interacting with the sample
*************************** ***************************

View file

@ -0,0 +1,3 @@
# Known issue: non secure platforms do not work with settings subsystem.
CONFIG_SETTINGS=n
CONFIG_BT_SETTINGS=n

View file

@ -13,7 +13,6 @@ CONFIG_BT_MESH_PB_ADV=n
CONFIG_BT=y CONFIG_BT=y
CONFIG_BT_DEVICE_NAME="Zephyr Mesh" CONFIG_BT_DEVICE_NAME="Zephyr Mesh"
CONFIG_BT_TINYCRYPT_ECC=y
CONFIG_BT_RX_STACK_SIZE=1400 CONFIG_BT_RX_STACK_SIZE=1400
CONFIG_BT_L2CAP_TX_BUF_COUNT=5 CONFIG_BT_L2CAP_TX_BUF_COUNT=5
CONFIG_BT_EXT_ADV=n CONFIG_BT_EXT_ADV=n

View file

@ -8,7 +8,6 @@ CONFIG_SETTINGS=y
CONFIG_HWINFO=y CONFIG_HWINFO=y
CONFIG_BT=y CONFIG_BT=y
CONFIG_BT_TINYCRYPT_ECC=y
CONFIG_BT_L2CAP_TX_BUF_COUNT=5 CONFIG_BT_L2CAP_TX_BUF_COUNT=5
CONFIG_BT_PERIPHERAL=y CONFIG_BT_PERIPHERAL=y
CONFIG_BT_OBSERVER=y CONFIG_BT_OBSERVER=y

View file

@ -7,6 +7,7 @@ tests:
- bbc_microbit - bbc_microbit
- qemu_x86 - qemu_x86
- nrf52840dk_nrf52840 - nrf52840dk_nrf52840
- nrf5340dk_nrf5340_cpuapp_ns
integration_platforms: integration_platforms:
- qemu_x86 - qemu_x86
tags: bluetooth tags: bluetooth

View file

@ -12,3 +12,9 @@ target_sources_ifdef(CONFIG_BOARD_BBC_MICROBIT app PRIVATE src/microbit.c)
if(NODE_ADDR) if(NODE_ADDR)
zephyr_compile_definitions(NODE_ADDR=${NODE_ADDR}) zephyr_compile_definitions(NODE_ADDR=${NODE_ADDR})
endif() endif()
if (CONFIG_BUILD_WITH_TFM)
target_include_directories(app PRIVATE
$<TARGET_PROPERTY:tfm,TFM_BINARY_DIR>/install/interface/include
)
endif()

View file

@ -54,3 +54,9 @@ For other boards, build and flash the application as follows:
Refer to your :ref:`board's documentation <boards>` for alternative Refer to your :ref:`board's documentation <boards>` for alternative
flash instructions if your board doesn't support the ``flash`` target. flash instructions if your board doesn't support the ``flash`` target.
To run the application on an :ref:`nrf5340dk_nrf5340`, a Bluetooth controller application
must also run on the network core. The :ref:`bluetooth-hci-rpmsg-sample` sample
application may be used. Build this sample with configuration
:zephyr_file:`samples/bluetooth/hci_rpmg/nrf5340_cpunet_bt_mesh-bt_ll_sw_split.conf`
to enable mesh support.

View file

@ -0,0 +1,3 @@
# Known issue: non secure platforms do not work with settings subsystem.
CONFIG_SETTINGS=n
CONFIG_BT_SETTINGS=n

View file

@ -2,10 +2,18 @@ CONFIG_MAIN_STACK_SIZE=512
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048 CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_BT=y CONFIG_BT=y
CONFIG_BT_TINYCRYPT_ECC=y
CONFIG_BT_OBSERVER=y CONFIG_BT_OBSERVER=y
CONFIG_BT_BROADCASTER=y CONFIG_BT_BROADCASTER=y
CONFIG_BT_CTLR_DUP_FILTER_LEN=0
CONFIG_BT_CTLR_LE_ENC=n
CONFIG_BT_CTLR_LE_PING=n
CONFIG_BT_DATA_LEN_UPDATE=n
CONFIG_BT_PHY_UPDATE=n
CONFIG_BT_CTLR_MIN_USED_CHAN=n
CONFIG_BT_CTLR_PRIVACY=n
CONFIG_BT_CTLR_CHAN_SEL_2=n
CONFIG_BT_MESH=y CONFIG_BT_MESH=y
CONFIG_BT_MESH_RELAY=y CONFIG_BT_MESH_RELAY=y
CONFIG_BT_MESH_SUBNET_COUNT=1 CONFIG_BT_MESH_SUBNET_COUNT=1

View file

@ -7,6 +7,7 @@ tests:
- bbc_microbit - bbc_microbit
- qemu_x86 - qemu_x86
- nrf52840dk_nrf52840 - nrf52840dk_nrf52840
- nrf5340dk_nrf5340_cpuapp_ns
integration_platforms: integration_platforms:
- qemu_x86 - qemu_x86
- bbc_microbit - bbc_microbit

View file

@ -7,3 +7,9 @@ find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(mesh_provisioner) project(mesh_provisioner)
target_sources(app PRIVATE src/main.c) target_sources(app PRIVATE src/main.c)
if (CONFIG_BUILD_WITH_TFM)
target_include_directories(app PRIVATE
$<TARGET_PROPERTY:tfm,TFM_BINARY_DIR>/install/interface/include
)
endif()

View file

@ -52,3 +52,9 @@ For other boards, build and flash the application as follows:
Refer to your :ref:`board's documentation <boards>` for alternative Refer to your :ref:`board's documentation <boards>` for alternative
flash instructions if your board doesn't support the ``flash`` target. flash instructions if your board doesn't support the ``flash`` target.
To run the application on an :ref:`nrf5340dk_nrf5340`, a Bluetooth controller application
must also run on the network core. The :ref:`bluetooth-hci-rpmsg-sample` sample
application may be used. Build this sample with configuration
:zephyr_file:`samples/bluetooth/hci_rpmg/nrf5340_cpunet_bt_mesh-bt_ll_sw_split.conf`
to enable mesh support.

View file

@ -0,0 +1,3 @@
# Known issue: non secure platforms do not work with settings subsystem.
CONFIG_SETTINGS=n
CONFIG_BT_SETTINGS=n

View file

@ -5,11 +5,19 @@ CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_MAIN_THREAD_PRIORITY=-2 CONFIG_MAIN_THREAD_PRIORITY=-2
CONFIG_BT=y CONFIG_BT=y
CONFIG_BT_TINYCRYPT_ECC=y
#CONFIG_BT_DEBUG_LOG=y #CONFIG_BT_DEBUG_LOG=y
CONFIG_BT_OBSERVER=y CONFIG_BT_OBSERVER=y
CONFIG_BT_BROADCASTER=y CONFIG_BT_BROADCASTER=y
CONFIG_BT_CTLR_DUP_FILTER_LEN=0
CONFIG_BT_CTLR_LE_ENC=n
CONFIG_BT_CTLR_LE_PING=n
CONFIG_BT_DATA_LEN_UPDATE=n
CONFIG_BT_PHY_UPDATE=n
CONFIG_BT_CTLR_MIN_USED_CHAN=n
CONFIG_BT_CTLR_PRIVACY=n
CONFIG_BT_CTLR_CHAN_SEL_2=n
CONFIG_BT_MESH=y CONFIG_BT_MESH=y
CONFIG_BT_MESH_SUBNET_COUNT=1 CONFIG_BT_MESH_SUBNET_COUNT=1
CONFIG_BT_MESH_APP_KEY_COUNT=1 CONFIG_BT_MESH_APP_KEY_COUNT=1

View file

@ -6,6 +6,7 @@ tests:
platform_allow: platform_allow:
- qemu_x86 - qemu_x86
- nrf52840dk_nrf52840 - nrf52840dk_nrf52840
- nrf5340dk_nrf5340_cpuapp_ns
integration_platforms: integration_platforms:
- qemu_x86 - qemu_x86
tags: bluetooth tags: bluetooth

View file

@ -120,8 +120,16 @@ zephyr_library_sources_ifdef(CONFIG_BT_MESH_OD_PRIV_PROXY_SRV sol_pdu_rpl_srv.c)
zephyr_library_sources_ifdef(CONFIG_BT_MESH_SOLICITATION solicitation.c) zephyr_library_sources_ifdef(CONFIG_BT_MESH_SOLICITATION solicitation.c)
zephyr_library_sources_ifdef(CONFIG_BT_MESH_USES_TINYCRYPT crypto_tc.c) if (CONFIG_BT_MESH_USES_TINYCRYPT)
zephyr_library_sources(crypto_tc.c)
zephyr_library_sources_ifdef(CONFIG_BT_MESH_USES_MBEDTLS_PSA crypto_psa.c) else()
zephyr_library_sources(crypto_psa.c)
endif()
zephyr_library_link_libraries_ifdef(CONFIG_MBEDTLS mbedTLS) zephyr_library_link_libraries_ifdef(CONFIG_MBEDTLS mbedTLS)
if (CONFIG_BUILD_WITH_TFM)
target_include_directories(${ZEPHYR_CURRENT_LIBRARY} PRIVATE
$<TARGET_PROPERTY:tfm,TFM_BINARY_DIR>/install/interface/include
)
endif()

View file

@ -15,6 +15,7 @@ if BT_MESH
choice BT_MESH_CRYPTO_LIB choice BT_MESH_CRYPTO_LIB
prompt "Crypto library selection for mesh security" prompt "Crypto library selection for mesh security"
default BT_MESH_USES_TFM_PSA if BUILD_WITH_TFM
default BT_MESH_USES_TINYCRYPT default BT_MESH_USES_TINYCRYPT
config BT_MESH_USES_TINYCRYPT config BT_MESH_USES_TINYCRYPT
@ -53,9 +54,18 @@ config BT_MESH_USES_MBEDTLS_PSA
on Zephyr's settings subsystem. on Zephyr's settings subsystem.
Not possible to use for embedded devices yet. Not possible to use for embedded devices yet.
config BT_MESH_USES_TFM_PSA
bool "Use TF-M PSA [EXPERIMENTAL]"
select EXPERIMENTAL
depends on BUILD_WITH_TFM
help
Use TF-M that implements PSA security framework. Support of TF-M is
experimental. It is only possible to use with platforms that TF-M supports.
For more platform details see TF-M documentation.
endchoice endchoice
if BT_MESH_USES_MBEDTLS_PSA if BT_MESH_USES_MBEDTLS_PSA || BT_MESH_USES_TFM_PSA
config BT_MESH_PSA_KEY_ID_USER_MIN_OFFSET config BT_MESH_PSA_KEY_ID_USER_MIN_OFFSET
int "Offset of BLE Mesh key id range regarding PSA_KEY_ID_USER_MIN" int "Offset of BLE Mesh key id range regarding PSA_KEY_ID_USER_MIN"
@ -69,7 +79,7 @@ config BT_MESH_PSA_KEY_ID_USER_MIN_OFFSET
for each application key, and two ids for the device key and device key candidate. for each application key, and two ids for the device key and device key candidate.
It should consider the Mesh Configuration Database instances if database enabled. It should consider the Mesh Configuration Database instances if database enabled.
endif # BT_MESH_USES_MBEDTLS_PSA endif # BT_MESH_USES_MBEDTLS_PSA || BT_MESH_USES_TFM_PSA
# Virtual option enabled whenever Generic Provisioning layer is needed # Virtual option enabled whenever Generic Provisioning layer is needed
config BT_MESH_PROV config BT_MESH_PROV

View file

@ -13,7 +13,7 @@ enum bt_mesh_key_type {
BT_MESH_KEY_TYPE_DEV BT_MESH_KEY_TYPE_DEV
}; };
#if defined CONFIG_BT_MESH_USES_MBEDTLS_PSA #if defined CONFIG_BT_MESH_USES_MBEDTLS_PSA || defined CONFIG_BT_MESH_USES_TFM_PSA
int bt_mesh_key_import(enum bt_mesh_key_type type, const uint8_t in[16], struct bt_mesh_key *out); int bt_mesh_key_import(enum bt_mesh_key_type type, const uint8_t in[16], struct bt_mesh_key *out);
int bt_mesh_key_export(uint8_t out[16], const struct bt_mesh_key *in); int bt_mesh_key_export(uint8_t out[16], const struct bt_mesh_key *in);