1 /* Copyright (c) 2023 Nordic Semiconductor ASA
2 * SPDX-License-Identifier: Apache-2.0
3 */
4
5 #include "babblekit/testcase.h"
6 #include "common.h"
7
8 extern const struct test_sample_data *sample_data;
9
10 extern int data_set;
11
data_parse_cb(struct bt_data * data,void * user_data)12 static bool data_parse_cb(struct bt_data *data, void *user_data)
13 {
14 if (data->type == BT_DATA_ENCRYPTED_AD_DATA) {
15 int err;
16 uint8_t decrypted_payload[sample_data->size_ad_data];
17 struct net_buf_simple decrypted_buf;
18 size_t decrypted_data_size = BT_EAD_DECRYPTED_PAYLOAD_SIZE(data->data_len);
19
20 if (decrypted_data_size != sample_data->size_ad_data) {
21 LOG_ERR("Size of decrypted data: %d", decrypted_data_size);
22 LOG_ERR("Size of sample data: %d", sample_data->size_ad_data);
23 TEST_FAIL("Computed size of data does not match the size of the data from "
24 "the sample. (data set %d)", data_set);
25 }
26
27 if (memcmp(sample_data->randomizer_little_endian, data->data,
28 BT_EAD_RANDOMIZER_SIZE) != 0) {
29 LOG_ERR("Received Randomizer: %s",
30 bt_hex(data->data, BT_EAD_RANDOMIZER_SIZE));
31 LOG_ERR("Expected Randomizer from sample: %s",
32 bt_hex(sample_data->randomizer_little_endian,
33 BT_EAD_RANDOMIZER_SIZE));
34 TEST_FAIL("Received Randomizer does not match the expected one.");
35 }
36
37 net_buf_simple_init_with_data(&decrypted_buf, decrypted_payload,
38 decrypted_data_size);
39
40 err = bt_ead_decrypt(sample_data->session_key, sample_data->iv, data->data,
41 data->data_len, decrypted_buf.data);
42 if (err != 0) {
43 TEST_FAIL("Error during decryption.");
44 } else if (memcmp(decrypted_buf.data, sample_data->ad_data, decrypted_data_size)) {
45 LOG_HEXDUMP_ERR(decrypted_buf.data, decrypted_data_size,
46 "Decrypted data from bt_ead_decrypt:");
47 LOG_HEXDUMP_ERR(sample_data->ad_data, sample_data->size_ad_data,
48 "Expected data from sample:");
49 TEST_FAIL("Decrypted AD data does not match expected sample data. (data set"
50 " %d)", data_set);
51 }
52
53 LOG_HEXDUMP_DBG(decrypted_buf.data, decrypted_data_size, "Raw decrypted data: ");
54
55 bt_data_parse(&decrypted_buf, &data_parse_cb, NULL);
56
57 TEST_PASS("Central test passed. (data set %d)", data_set);
58
59 return false;
60 }
61
62 LOG_DBG("Parsed data:");
63 LOG_DBG("len : %d", data->data_len);
64 LOG_DBG("type: 0x%02x", data->type);
65 LOG_HEXDUMP_DBG(data->data, data->data_len, "data:");
66
67 return true;
68 }
69
device_found(const bt_addr_le_t * addr,int8_t rssi,uint8_t type,struct net_buf_simple * ad)70 static void device_found(const bt_addr_le_t *addr, int8_t rssi, uint8_t type,
71 struct net_buf_simple *ad)
72 {
73 char addr_str[BT_ADDR_LE_STR_LEN];
74
75 bt_addr_le_to_str(addr, addr_str, sizeof(addr_str));
76
77 LOG_DBG("Device found: %s (RSSI %d)", addr_str, rssi);
78
79 bt_data_parse(ad, &data_parse_cb, NULL);
80 }
81
start_scan(void)82 static void start_scan(void)
83 {
84 int err;
85
86 err = bt_le_scan_start(BT_LE_SCAN_PASSIVE, device_found);
87 if (err) {
88 TEST_FAIL("Scanning failed to start (err %d)", err);
89 }
90
91 LOG_DBG("Scanning successfully started");
92 }
93
test_central(void)94 void test_central(void)
95 {
96 int err;
97
98 LOG_DBG("Central device. (data set %d)", data_set);
99
100 err = bt_enable(NULL);
101 if (err) {
102 TEST_FAIL("Bluetooth init failed (err %d)", err);
103 }
104
105 LOG_DBG("Bluetooth initialized");
106
107 start_scan();
108 }
109