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