bt-crypto: add option to use PSA APIs instead of TinyCrypt

This commit adds CONFIG_BT_USE_PSA_API to allow the end
user to prefer PSA APIs over TinyCrypt for crypto operations
in bluetooth. Of course, this is possible only if
a PSA provider is available on the system, i.e.
CONFIG_PSA_CRYPTO_CLIENT is set.

This commit also extends tests/bluetooth/bt_crypto adding
a test case for PSA.

Signed-off-by: Valerio Setti <vsetti@baylibre.com>
This commit is contained in:
Valerio Setti 2024-05-28 07:36:47 +02:00 committed by Alberto Escolar
commit 9032f8d791
8 changed files with 123 additions and 25 deletions

View file

@ -192,6 +192,13 @@ rsource "crypto/Kconfig"
rsource "lib/Kconfig" rsource "lib/Kconfig"
rsource "Kconfig.logging" rsource "Kconfig.logging"
config BT_USE_PSA_API
bool "Use PSA APIs instead of TinyCrypt for crypto operations"
depends on BT_CRYPTO || BT_HOST_CRYPTO
depends on PSA_CRYPTO_CLIENT
help
Use PSA APIs instead of TinyCrypt for crypto operations
endif # BT_HCI endif # BT_HCI
config BT_COMPANY_ID config BT_COMPANY_ID

View file

@ -4,6 +4,16 @@ zephyr_library()
zephyr_library_sources(bt_crypto.c) zephyr_library_sources(bt_crypto.c)
if(CONFIG_BT_USE_PSA_API)
zephyr_library_sources(bt_crypto_psa.c)
zephyr_library_link_libraries_ifdef(CONFIG_MBEDTLS mbedTLS)
zephyr_library_include_directories_ifdef(CONFIG_BUILD_WITH_TFM
$<TARGET_PROPERTY:tfm,TFM_BINARY_DIR>/api_ns/interface/include
)
else()
zephyr_library_sources(bt_crypto_tc.c)
endif()
if(CONFIG_BT_CRYPTO_LOG_LEVEL_DBG) if(CONFIG_BT_CRYPTO_LOG_LEVEL_DBG)
message(WARNING "CONFIG_BT_CRYPTO_LOG_LEVEL_DBG is enabled. message(WARNING "CONFIG_BT_CRYPTO_LOG_LEVEL_DBG is enabled.
Private security keys such as the Long Term Key will be printed out. Private security keys such as the Long Term Key will be printed out.

View file

@ -3,8 +3,10 @@
config BT_CRYPTO config BT_CRYPTO
bool bool
select TINYCRYPT select TINYCRYPT if !BT_USE_PSA_API
select TINYCRYPT_AES select TINYCRYPT_AES if !BT_USE_PSA_API
select TINYCRYPT_AES_CMAC select TINYCRYPT_AES_CMAC if !BT_USE_PSA_API
select PSA_WANT_KEY_TYPE_AES if BT_USE_PSA_API
select PSA_WANT_ALG_CMAC if BT_USE_PSA_API
help help
This option enables the Bluetooth Cryptographic Toolbox. This option enables the Bluetooth Cryptographic Toolbox.

View file

@ -7,8 +7,12 @@
#include <zephyr/sys/byteorder.h> #include <zephyr/sys/byteorder.h>
#if defined(CONFIG_BT_USE_PSA_API)
#include "psa/crypto.h"
#else
#include <tinycrypt/cmac_mode.h> #include <tinycrypt/cmac_mode.h>
#include <tinycrypt/constants.h> #include <tinycrypt/constants.h>
#endif
#include "common/bt_str.h" #include "common/bt_str.h"
#include "bt_crypto.h" #include "bt_crypto.h"
@ -17,27 +21,6 @@
#include <zephyr/logging/log.h> #include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(bt_crypto); LOG_MODULE_REGISTER(bt_crypto);
int bt_crypto_aes_cmac(const uint8_t *key, const uint8_t *in, size_t len, uint8_t *out)
{
struct tc_aes_key_sched_struct sched;
struct tc_cmac_struct state;
if (tc_cmac_setup(&state, key, &sched) == TC_CRYPTO_FAIL) {
return -EIO;
}
if (tc_cmac_update(&state, in, len) == TC_CRYPTO_FAIL) {
return -EIO;
}
if (tc_cmac_final(out, &state) == TC_CRYPTO_FAIL) {
return -EIO;
}
return 0;
}
int bt_crypto_f4(const uint8_t *u, const uint8_t *v, const uint8_t *x, uint8_t z, uint8_t res[16]) int bt_crypto_f4(const uint8_t *u, const uint8_t *v, const uint8_t *x, uint8_t z, uint8_t res[16])
{ {
uint8_t xs[16]; uint8_t xs[16];

View file

@ -0,0 +1,46 @@
/* Copyright (c) 2022 Nordic Semiconductor ASA
* SPDX-License-Identifier: Apache-2.0
*/
#include <errno.h>
#include <string.h>
#include <zephyr/sys/byteorder.h>
#include "psa/crypto.h"
#include "common/bt_str.h"
#include "bt_crypto.h"
#define LOG_LEVEL CONFIG_BT_CRYPTO_LOG_LEVEL
#include <zephyr/logging/log.h>
LOG_MODULE_DECLARE(bt_crypto);
int bt_crypto_aes_cmac(const uint8_t *key, const uint8_t *in, size_t len, uint8_t *out)
{
psa_key_id_t key_id;
psa_key_attributes_t key_attr = PSA_KEY_ATTRIBUTES_INIT;
size_t out_size;
psa_status_t status, destroy_status;
psa_set_key_type(&key_attr, PSA_KEY_TYPE_AES);
psa_set_key_bits(&key_attr, 128);
psa_set_key_usage_flags(&key_attr, PSA_KEY_USAGE_SIGN_MESSAGE |
PSA_KEY_USAGE_VERIFY_MESSAGE);
psa_set_key_algorithm(&key_attr, PSA_ALG_CMAC);
status = psa_import_key(&key_attr, key, 16, &key_id);
if (status != PSA_SUCCESS) {
LOG_ERR("Failed to import AES key %d", status);
return -EIO;
}
status = psa_mac_compute(key_id, PSA_ALG_CMAC, in, len, out, 16, &out_size);
destroy_status = psa_destroy_key(key_id);
if ((status != PSA_SUCCESS) || (destroy_status != PSA_SUCCESS)) {
LOG_ERR("Failed to compute MAC %d", status);
return -EIO;
}
return 0;
}

View file

@ -0,0 +1,34 @@
/* Copyright (c) 2022 Nordic Semiconductor ASA
* SPDX-License-Identifier: Apache-2.0
*/
#include <errno.h>
#include <string.h>
#include <zephyr/sys/byteorder.h>
#include <tinycrypt/cmac_mode.h>
#include <tinycrypt/constants.h>
#include "common/bt_str.h"
#include "bt_crypto.h"
int bt_crypto_aes_cmac(const uint8_t *key, const uint8_t *in, size_t len, uint8_t *out)
{
struct tc_aes_key_sched_struct sched;
struct tc_cmac_struct state;
if (tc_cmac_setup(&state, key, &sched) == TC_CRYPTO_FAIL) {
return -EIO;
}
if (tc_cmac_update(&state, in, len) == TC_CRYPTO_FAIL) {
return -EIO;
}
if (tc_cmac_final(out, &state) == TC_CRYPTO_FAIL) {
return -EIO;
}
return 0;
}

View file

@ -12,3 +12,19 @@ tests:
integration_platforms: integration_platforms:
- native_sim - native_sim
tags: bluetooth tags: bluetooth
bluetooth.bt_crypto.psa:
filter: CONFIG_PSA_CRYPTO_CLIENT
extra_args:
- EXTRA_DTC_OVERLAY_FILE="test.overlay"
platform_allow:
- native_posix
- native_posix/native/64
- native_sim
- native_sim/native/64
- qemu_x86
- qemu_cortex_m3
- nrf5340dk/nrf5340/cpuapp/ns
- nrf52840dk/nrf52840
integration_platforms:
- native_sim
tags: bluetooth

View file

@ -12,7 +12,7 @@ add_library(mocks STATIC
mocks/hmac_prng_expects.c mocks/hmac_prng_expects.c
mocks/crypto_help_utils.c mocks/crypto_help_utils.c
${ZEPHYR_BASE}/subsys/bluetooth/host/crypto.c ${ZEPHYR_BASE}/subsys/bluetooth/host/crypto_tc.c
${ZEPHYR_BASE}/subsys/logging/log_minimal.c ${ZEPHYR_BASE}/subsys/logging/log_minimal.c
${ZEPHYR_BASE}/subsys/bluetooth/common/bt_str.c ${ZEPHYR_BASE}/subsys/bluetooth/common/bt_str.c
${ZEPHYR_BASE}/subsys/bluetooth/host/uuid.c ${ZEPHYR_BASE}/subsys/bluetooth/host/uuid.c