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
create_adv(struct bt_le_ext_adv ** adv)12 static void create_adv(struct bt_le_ext_adv **adv)
13 {
14 int err;
15 struct bt_le_adv_param params;
16
17 memset(¶ms, 0, sizeof(struct bt_le_adv_param));
18
19 params.options |= BT_LE_ADV_OPT_CONN;
20 params.options |= BT_LE_ADV_OPT_EXT_ADV;
21
22 params.id = BT_ID_DEFAULT;
23 params.sid = 0;
24 params.interval_min = BT_GAP_ADV_SLOW_INT_MIN;
25 params.interval_max = BT_GAP_ADV_SLOW_INT_MAX;
26
27 err = bt_le_ext_adv_create(¶ms, NULL, adv);
28 if (err) {
29 TEST_FAIL("Failed to create advertiser (%d)", err);
30 }
31 }
32
start_adv(struct bt_le_ext_adv * adv)33 static void start_adv(struct bt_le_ext_adv *adv)
34 {
35 int err;
36 int32_t timeout = 0;
37 uint8_t num_events = 0;
38
39 struct bt_le_ext_adv_start_param start_params;
40
41 start_params.timeout = timeout;
42 start_params.num_events = num_events;
43
44 err = bt_le_ext_adv_start(adv, &start_params);
45 if (err) {
46 TEST_FAIL("Failed to start advertiser (%d)", err);
47 }
48
49 LOG_DBG("Advertiser started");
50 }
51
set_ad_data(struct bt_le_ext_adv * adv)52 static void set_ad_data(struct bt_le_ext_adv *adv)
53 {
54 int err;
55
56 uint8_t ead[sample_data->size_ead];
57 struct bt_data ead_struct;
58 size_t size_ad_data = sample_data->size_ad_data;
59 size_t size_ead = BT_EAD_ENCRYPTED_PAYLOAD_SIZE(size_ad_data);
60
61 if (size_ead != sample_data->size_ead) {
62 LOG_ERR("Size of ead: %zu\n", size_ead);
63 LOG_ERR("Size of sample_ead: %zu", sample_data->size_ead);
64 TEST_FAIL("Computed size of encrypted data does not match the size of the encrypted"
65 " data from the sample. (data set %d)", data_set);
66 }
67
68 err = bt_test_ead_encrypt(sample_data->session_key, sample_data->iv,
69 sample_data->randomizer_little_endian, sample_data->ad_data,
70 size_ad_data, ead);
71 if (err != 0) {
72 TEST_FAIL("Error during encryption.");
73 } else if (memcmp(ead, sample_data->ead, sample_data->size_ead) != 0) {
74 LOG_HEXDUMP_ERR(ead, size_ead, "Encrypted data from bt_ead_encrypt:");
75 LOG_HEXDUMP_ERR(sample_data->ead, sample_data->size_ead,
76 "Encrypted data from sample:");
77 TEST_FAIL("Encrypted AD data does not match the ones provided in the sample. (data"
78 " set %d)", data_set);
79 }
80
81 LOG_HEXDUMP_DBG(ead, size_ead, "Encrypted data:");
82
83 ead_struct.data_len = size_ead;
84 ead_struct.type = BT_DATA_ENCRYPTED_AD_DATA;
85 ead_struct.data = ead;
86
87 err = bt_le_ext_adv_set_data(adv, &ead_struct, 1, NULL, 0);
88 if (err) {
89 TEST_FAIL("Failed to set advertising data (%d)", err);
90 }
91
92 TEST_PASS("Peripheral test passed. (data set %d)", data_set);
93 }
94
test_peripheral(void)95 void test_peripheral(void)
96 {
97 int err;
98 struct bt_le_ext_adv *adv = NULL;
99
100 LOG_DBG("Peripheral device. (data set %d)", data_set);
101
102 err = bt_enable(NULL);
103 if (err) {
104 TEST_FAIL("Bluetooth init failed (err %d)", err);
105 }
106
107 LOG_DBG("Bluetooth initialized");
108
109 create_adv(&adv);
110 start_adv(adv);
111
112 set_ad_data(adv);
113 }
114