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(&params, 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(&params, 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