blob: ee2fa5d3da80f090e3a268e36e570c414c3f8287 [file] [log] [blame]
/* Copyright (c) 2023 Nordic Semiconductor ASA
* SPDX-License-Identifier: Apache-2.0
*/
#include "common.h"
extern const struct test_sample_data *sample_data;
extern int data_set;
static bool data_parse_cb(struct bt_data *data, void *user_data)
{
if (data->type == BT_DATA_ENCRYPTED_AD_DATA) {
int err;
uint8_t decrypted_payload[sample_data->size_ad_data];
struct net_buf_simple decrypted_buf;
size_t decrypted_data_size = BT_EAD_DECRYPTED_PAYLOAD_SIZE(data->data_len);
if (decrypted_data_size != sample_data->size_ad_data) {
LOG_ERR("Size of decrypted data: %d", decrypted_data_size);
LOG_ERR("Size of sample data: %d", sample_data->size_ad_data);
FAIL("Computed size of data does not match the size of the data from the "
"sample. (data set %d)\n",
data_set);
}
if (memcmp(sample_data->randomizer_little_endian, data->data,
BT_EAD_RANDOMIZER_SIZE) != 0) {
LOG_ERR("Received Randomizer: %s",
bt_hex(data->data, BT_EAD_RANDOMIZER_SIZE));
LOG_ERR("Expected Randomizer from sample: %s",
bt_hex(sample_data->randomizer_little_endian,
BT_EAD_RANDOMIZER_SIZE));
FAIL("Received Randomizer does not match the expected one.\n");
}
net_buf_simple_init_with_data(&decrypted_buf, decrypted_payload,
decrypted_data_size);
err = bt_ead_decrypt(sample_data->session_key, sample_data->iv, data->data,
data->data_len, decrypted_buf.data);
if (err != 0) {
FAIL("Error during decryption.\n");
} else if (memcmp(decrypted_buf.data, sample_data->ad_data, decrypted_data_size)) {
LOG_HEXDUMP_ERR(decrypted_buf.data, decrypted_data_size,
"Decrypted data from bt_ead_decrypt:");
LOG_HEXDUMP_ERR(sample_data->ad_data, sample_data->size_ad_data,
"Expected data from sample:");
FAIL("Decrypted AD data does not match expected sample data. (data set "
"%d)\n",
data_set);
}
LOG_HEXDUMP_DBG(decrypted_buf.data, decrypted_data_size, "Raw decrypted data: ");
bt_data_parse(&decrypted_buf, &data_parse_cb, NULL);
PASS("Central test passed. (data set %d)\n", data_set);
return false;
}
LOG_DBG("Parsed data:");
LOG_DBG("len : %d", data->data_len);
LOG_DBG("type: 0x%02x", data->type);
LOG_HEXDUMP_DBG(data->data, data->data_len, "data:");
return true;
}
static void device_found(const bt_addr_le_t *addr, int8_t rssi, uint8_t type,
struct net_buf_simple *ad)
{
char addr_str[BT_ADDR_LE_STR_LEN];
bt_addr_le_to_str(addr, addr_str, sizeof(addr_str));
LOG_DBG("Device found: %s (RSSI %d)", addr_str, rssi);
bt_data_parse(ad, &data_parse_cb, NULL);
}
static void start_scan(void)
{
int err;
err = bt_le_scan_start(BT_LE_SCAN_PASSIVE, device_found);
if (err) {
FAIL("Scanning failed to start (err %d)\n", err);
}
LOG_DBG("Scanning successfully started");
}
void test_central(void)
{
int err;
LOG_DBG("Central device. (data set %d)", data_set);
err = bt_enable(NULL);
if (err) {
FAIL("Bluetooth init failed (err %d)\n", err);
}
LOG_DBG("Bluetooth initialized");
start_scan();
}