xref: /btstack/test/security_manager/security_manager.cpp (revision 077fecbb6ed539507f37505ebd8a5b00e01c55e9)
1 
2 // *****************************************************************************
3 //
4 // test rfcomm query tests
5 //
6 // *****************************************************************************
7 
8 
9 #include <stdint.h>
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 
14 #include "CppUTest/TestHarness.h"
15 #include "CppUTest/CommandLineTestRunner.h"
16 
17 #include "btstack_run_loop_embedded.h"
18 
19 #include "hci_cmd.h"
20 #include "btstack_util.h"
21 #include "btstack_debug.h"
22 #include "btstack_memory.h"
23 #include "hci.h"
24 #include "hci_dump.h"
25 #include "hci_dump_posix_fs.h"
26 #include "l2cap.h"
27 #include "ble/sm.h"
28 
29 uint8_t test_command_packet_sc_read_public_key[] = { 0x25, 0x20, 0x00 };
30 
31 // test data
32 
33 uint8_t test_command_packet_01[] = {
34     0x17, 0x20, 0x20, 0x9f, 0x9e, 0x9d, 0x9c, 0x9b, 0x9a, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93,
35     0x92, 0x91, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
36     0x00, 0x00, 0x00, };
37 uint8_t test_command_packet_02[] = {
38     0x17, 0x20, 0x20, 0x9f, 0x9e, 0x9d, 0x9c, 0x9b, 0x9a, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93,
39     0x92, 0x91, 0x90, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40     0x00, 0x00, 0x00, };
41 uint8_t test_acl_packet_03[] = {
42     0x40, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x06, 0x00, 0x02, 0x03, 0x00, 0x01, 0x10, 0x07, 0x07, };
43 uint8_t test_command_packet_04[] = {
44     0x18, 0x20, 0x00, };
45 uint8_t test_command_packet_05[] = {
46     0x18, 0x20, 0x00, };
47 uint8_t test_command_packet_06[] = {
48     0x17, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49     0x00, 0x00, 0x00, 0x7b, 0x05, 0xd4, 0xef, 0x0e, 0x26, 0x2f, 0x4f, 0x94, 0x9e, 0x45, 0x72, 0x85,
50     0x92, 0x03, 0x28, };
51 uint8_t test_command_packet_07[] = {
52     0x17, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
53     0x00, 0x00, 0x00, 0x87, 0xd0, 0x7b, 0x7f, 0xad, 0x4d, 0x47, 0xa6, 0x84, 0x2c, 0x85, 0x79, 0x58,
54     0xd3, 0xfe, 0xcd, };
55 uint8_t test_acl_packet_08[] = {
56     0x40, 0x00, 0x15, 0x00, 0x11, 0x00, 0x06, 0x00, 0x03, 0xa9, 0xe9, 0x8d, 0x9a, 0xc3, 0x96, 0xe3,
57     0x52, 0xa1, 0x17, 0xc0, 0xb2, 0xbe, 0x76, 0x42, 0xda, };
58 uint8_t test_command_packet_09[] = {
59     0x17, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60     0x00, 0x00, 0x00, 0xfc, 0xd4, 0x07, 0x41, 0x0f, 0x1f, 0xcc, 0x83, 0xd2, 0x41, 0xaf, 0xf7, 0x5f,
61     0xd0, 0x31, 0x2e, };
62 uint8_t test_command_packet_10[] = {
63     0x17, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
64     0x00, 0x00, 0x00, 0x71, 0xd8, 0xbe, 0xe4, 0xb5, 0x48, 0x4d, 0x35, 0x80, 0x5e, 0x95, 0xf9, 0xb9,
65     0xaf, 0xc2, 0x55, };
66 uint8_t test_acl_packet_11[] = {
67     0x40, 0x00, 0x15, 0x00, 0x11, 0x00, 0x06, 0x00, 0x04, 0x7a, 0x05, 0xd5, 0xeb, 0x0e, 0x27, 0x3f,
68     0x48, 0x93, 0x9c, 0x46, 0x72, 0x84, 0x82, 0x04, 0x2f, };
69 uint8_t test_command_packet_12[] = {
70     0x17, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71     0x00, 0x00, 0x00, 0xfd, 0xd4, 0x06, 0x45, 0x0f, 0x1e, 0xdc, 0x84, 0x7a, 0x05, 0xd5, 0xeb, 0x0e,
72     0x27, 0x3f, 0x48, };
73 uint8_t test_command_packet_13[] = {
74     0x1a, 0x20, 0x12, 0x40, 0x00, 0xd1, 0x36, 0xa2, 0x5f, 0x8d, 0x5f, 0xd4, 0xd1, 0x70, 0x56, 0x1c,
75     0x12, 0x99, 0x98, 0x95, 0x30, };
76 uint8_t test_command_packet_14[] = {
77     0x18, 0x20, 0x00, };
78 uint8_t test_command_packet_15[] = {
79     0x18, 0x20, 0x00, };
80 uint8_t test_command_packet_16[] = {
81     0x17, 0x20, 0x20, 0xc7, 0x29, 0x17, 0x92, 0x59, 0xb9, 0x8f, 0xaa, 0xa2, 0x0a, 0x32, 0x2a, 0x73,
82     0xc6, 0x4f, 0xb5, 0xcf, 0x10, 0x70, 0x5f, 0x3c, 0x2d, 0xe3, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00,
83     0x00, 0x00, 0x00, };
84 uint8_t test_command_packet_17[] = {
85     0x17, 0x20, 0x20, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33,
86     0x32, 0x31, 0x30, 0xe2, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87     0x00, 0x00, 0x00, };
88 uint8_t test_command_packet_18[] = {
89     0x17, 0x20, 0x20, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33,
90     0x32, 0x31, 0x30, 0xe2, 0xf1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91     0x00, 0x00, 0x00, };
92 
93 uint8_t test_acl_packet_18[] = {
94     0x40, 0x00, 0x15, 0x00, 0x11, 0x00, 0x06, 0x00, 0x06, 0xef, 0x2f, 0xd9, 0x0b, 0x04, 0x7a, 0xe9,
95     0xa1, 0xcf, 0xc3, 0xa3, 0x83, 0xb7, 0x38, 0x30, 0x73, };
96 uint8_t test_acl_packet_19[] = {
97     0x40, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x07, 0x5b, 0xb4, 0xcf, 0x10, 0x70, 0x5f, 0x3c,
98     0x2d, 0xe3, 0xb3, };
99 uint8_t test_acl_packet_20[] = {
100     0x40, 0x00, 0x15, 0x00, 0x11, 0x00, 0x06, 0x00, 0x08, 0xe6, 0xea, 0xee, 0x60, 0x31, 0x7b, 0xfc,
101     0xa2, 0x3f, 0xa5, 0x79, 0x59, 0xe7, 0x41, 0xcf, 0xc7, };
102 uint8_t test_acl_packet_21[] = {
103     0x40, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x09, 0x00, 0xef, 0x32, 0x07, 0xdc, 0x1b, 0x00, };
104 uint8_t test_acl_packet_22[] = {
105     0x40, 0x00, 0x15, 0x00, 0x11, 0x00, 0x06, 0x00, 0x0a, 0x1d, 0x06, 0xba, 0xf4, 0x0c, 0x49, 0x55,
106     0x5b, 0x93, 0x93, 0xc1, 0x8b, 0x09, 0xd0, 0xb8, 0x80, };
107 
108 bd_addr_t test_device_addr = {0x34, 0xb1, 0xf7, 0xd1, 0x77, 0x9b};
109 
110 static btstack_packet_callback_registration_t sm_event_callback_registration;
111 
112 extern "C" {
113     void mock_init(void);
114     void mock_simulate_hci_state_working(void);
115     void mock_simulate_hci_event(uint8_t * packet, uint16_t size);
116     void aes128_report_result(void);
117     void mock_simulate_sm_data_packet(uint8_t * packet, uint16_t size);
118     void mock_simulate_command_complete(const hci_cmd_t *cmd);
119     void mock_simulate_connected(void);
120     uint8_t * mock_packet_buffer(void);
121     uint16_t mock_packet_buffer_len(void);
122     void mock_clear_packet_buffer(void);
123 }
124 
125 void app_packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
126     uint16_t aHandle;
127     bd_addr_t event_address;
128     switch (packet_type) {
129         case HCI_EVENT_PACKET:
130             switch (packet[0]) {
131                 case SM_EVENT_PASSKEY_INPUT_NUMBER:
132                     // store peer address for input
133                     printf("\nGAP Bonding: Enter 6 digit passkey: '");
134                     fflush(stdout);
135                     break;
136 
137                 case SM_EVENT_PASSKEY_DISPLAY_NUMBER:
138                     printf("\nGAP Bonding: Display Passkey '%06u\n", little_endian_read_32(packet, 11));
139                     break;
140 
141                 case SM_EVENT_PASSKEY_DISPLAY_CANCEL:
142                     printf("\nGAP Bonding: Display cancel\n");
143                     break;
144 
145                 case SM_EVENT_JUST_WORKS_REQUEST:
146                     // auto-authorize connection if requested
147                     sm_just_works_confirm(little_endian_read_16(packet, 2));
148                     printf("Just Works request confirmed\n");
149                     break;
150 
151                 case SM_EVENT_AUTHORIZATION_REQUEST:
152                     // auto-authorize connection if requested
153                     sm_authorization_grant(little_endian_read_16(packet, 2));
154                     break;
155 
156                 default:
157                     break;
158             }
159     }
160 }
161 
162 void CHECK_EQUAL_ARRAY(uint8_t * expected, uint8_t * actual, int size){
163 	int i;
164 	for (i=0; i<size; i++){
165 		if (expected[i] != actual[i]) {
166 			printf("offset %u wrong\n", i);
167 			printf("expected: "); printf_hexdump(expected, size);
168 			printf("actual:   "); printf_hexdump(actual, size);
169 		}
170 		BYTES_EQUAL(expected[i], actual[i]);
171 	}
172 }
173 
174 #define CHECK_HCI_COMMAND(packet) { log_info("check " #packet) ; CHECK_EQUAL_ARRAY(packet, mock_packet_buffer(), sizeof(packet)); mock_clear_packet_buffer(); }
175 #define CHECK_ACL_PACKET(packet)  { log_info("check " #packet) ; CHECK_EQUAL_ARRAY(packet, mock_packet_buffer(), sizeof(packet)); mock_clear_packet_buffer(); }
176 
177 static int parse_hex(uint8_t * buffer, const char * hex_string){
178     int len = 0;
179     while (*hex_string){
180         if (*hex_string == ' '){
181             hex_string++;
182             continue;
183         }
184         int high_nibble = nibble_for_char(*hex_string++);
185         int low_nibble = nibble_for_char(*hex_string++);
186         *buffer++ = (high_nibble << 4) | low_nibble;
187         len++;
188     }
189     return len;
190 }
191 
192 static const char * key_string = "2b7e1516 28aed2a6 abf71588 09cf4f3c";
193 
194 static const char * m0_string        = "";
195 static const char * cmac_m0_string   = "bb1d6929 e9593728 7fa37d12 9b756746";
196 static const char * m16_string       = "6bc1bee2 2e409f96 e93d7e11 7393172a";
197 static const char * cmac_m16_string  = "070a16b4 6b4d4144 f79bdd9d d04a287c";
198 static const char * m40_string       = "6bc1bee2 2e409f96 e93d7e11 7393172a ae2d8a57 1e03ac9c 9eb76fac 45af8e51 30c81c46 a35ce411";
199 static const char * cmac_m40_string  = "dfa66747 de9ae630 30ca3261 1497c827";
200 static const char * m64_string       = "6bc1bee2 2e409f96 e93d7e11 7393172a ae2d8a57 1e03ac9c 9eb76fac 45af8e51 30c81c46 a35ce411 e5fbc119 1a0a52ef f69f2445 df4f9b17 ad2b417b e66c3710";
201 static const char * cmac_m64_string  = "51f0bebf 7e3b9d92 fc497417 79363cfe";
202 
203 static uint8_t cmac_hash[16];
204 static int cmac_hash_received;
205 static void cmac_done(uint8_t * hash){
206     memcpy(cmac_hash, hash, 16);
207     printf("cmac hash: ");
208     printf_hexdump(hash, 16);
209     cmac_hash_received = 1;
210 }
211 
212 static uint8_t m[128];
213 
214 #define VALIDATE_MESSAGE(NAME) validate_message(#NAME, NAME##_string, cmac_##NAME##_string)
215 
216 TEST_GROUP(SecurityManager){
217 	void setup(void){
218         static int first = 1;
219         if (first){
220             first = 0;
221             btstack_memory_init();
222             btstack_run_loop_init(btstack_run_loop_embedded_get_instance());
223         }
224 	    sm_init();
225 	    sm_set_io_capabilities(IO_CAPABILITY_NO_INPUT_NO_OUTPUT);
226 	    sm_set_authentication_requirements( SM_AUTHREQ_BONDING );
227         sm_event_callback_registration.callback = &app_packet_handler;
228         sm_add_event_handler(&sm_event_callback_registration);
229 
230 
231         // log into file using HCI_DUMP_PACKETLOGGER format
232         const char * log_path = "hci_dump.pklg";
233         hci_dump_posix_fs_open(log_path, HCI_DUMP_PACKETLOGGER);
234         hci_dump_init(hci_dump_posix_fs_get_instance());
235         printf("Packet Log: %s\n", log_path);
236     }
237 };
238 
239 TEST(SecurityManager, MainTest){
240 
241     mock_init();
242     mock_simulate_hci_state_working();
243 
244 #ifdef ENABLE_LE_SECURE_CONNECTIONS
245 	// on start, new ECC Key is generated
246 #ifdef ENABLE_MICRO_ECC_FOR_LE_SECURE_CONNECTIONS
247     // with uECC, this requires to get some random data
248     int i;
249     for (i=0;i<8;i++){
250 		CHECK_HCI_COMMAND(test_command_packet_04);
251 		uint8_t rand_sc_1_data_event[] = { 0x0e, 0x0c, 0x01, 0x18, 0x20, 0x00, 0x2f, 0x04, 0x82, 0x84, 0x72, 0x46, 0x9c, 0x93 };
252 		mock_simulate_hci_event(&rand_sc_1_data_event[0], sizeof(rand_sc_1_data_event));
253     }
254 #else
255 	// with Controller support, the stack will read public key
256 	CHECK_HCI_COMMAND(test_command_packet_sc_read_public_key);
257 	uint8_t read_public_key_event[] = {
258 			0x3E, 0x42, 0x08, 0x00, 0xD1, 0xD2, 0x7C, 0xF7, 0x08, 0x34, 0xC8, 0x19, 0xEC, 0x92, 0x39, 0x8D,
259 			0x55, 0xE7, 0xAB, 0x25, 0xDE, 0x7B, 0x32, 0x05, 0x64, 0xA8, 0x90, 0xA7, 0xE6, 0x52, 0x7B, 0x41,
260 			0x29, 0x14, 0xA3, 0xAE, 0x73, 0xC9, 0x57, 0x20, 0xA8, 0x5F, 0xFE, 0xE7, 0xC1, 0x27, 0xDE, 0x7D,
261 			0xB7, 0x25, 0xB0, 0xC1, 0x9E, 0x1F, 0xFE, 0xD1, 0xF0, 0x21, 0x22, 0x7E, 0x1F, 0xF4, 0x5D, 0x07,
262 			0x6D, 0x6F, 0x12, 0x06
263 	};
264 	mock_simulate_hci_event(&read_public_key_event[0], sizeof(read_public_key_event));
265 #endif
266 #endif
267 
268 #ifndef ENABLE_SOFTWARE_AES128
269     // expect le encrypt commmand
270     CHECK_HCI_COMMAND(test_command_packet_01);
271     aes128_report_result();
272 
273     // expect le encrypt commmand
274     CHECK_HCI_COMMAND(test_command_packet_02);
275     aes128_report_result();
276 #endif
277 
278 	mock_clear_packet_buffer();
279 
280     mock_simulate_connected();
281 
282     uint8_t test_pairing_request_command[] = { 0x01, 0x04, 0x00, 0x01, 0x10, 0x07, 0x07 };
283     mock_simulate_sm_data_packet(&test_pairing_request_command[0], sizeof(test_pairing_request_command));
284 
285     // expect send pairing response command
286     CHECK_ACL_PACKET(test_acl_packet_03);
287 
288     uint8_t test_pairing_confirm_command[] = { 0x03, 0x84, 0x5a, 0x87, 0x9a, 0x0f, 0xa9, 0x42, 0xba, 0x48, 0xc5, 0x79, 0xa0, 0x70, 0x70, 0xa9, 0xc8 };
289     mock_simulate_sm_data_packet(&test_pairing_confirm_command[0], sizeof(test_pairing_confirm_command));
290 
291     // expect le random command
292     CHECK_HCI_COMMAND(test_command_packet_04);
293 
294     uint8_t rand1_data_event[] = { 0x0e, 0x0c, 0x01, 0x18, 0x20, 0x00, 0x2f, 0x04, 0x82, 0x84, 0x72, 0x46, 0x9c, 0x93 };
295 	mock_simulate_hci_event(&rand1_data_event[0], sizeof(rand1_data_event));
296 
297     // expect le random command
298     CHECK_HCI_COMMAND(test_command_packet_05);
299 
300     uint8_t rand2_data_event[] = { 0x0e, 0x0c,0x01, 0x18,0x20, 0x00,0x48, 0x3f,0x27, 0x0e,0xeb, 0xd5,0x05, 0x7a };
301 	mock_simulate_hci_event(&rand2_data_event[0], sizeof(rand2_data_event));
302 
303 #ifdef ENABLE_SOFTWARE_AES128
304 	// process sm_run_trigger()
305     btstack_run_loop_embedded_execute_once();
306 #else
307     // expect le encrypt command
308     CHECK_HCI_COMMAND(test_command_packet_06);
309     aes128_report_result();
310 
311     // expect le encrypt command
312     CHECK_HCI_COMMAND(test_command_packet_07);
313     aes128_report_result();
314 #endif
315 
316 
317     // expect send pairing confirm command
318     CHECK_ACL_PACKET(test_acl_packet_08);
319 
320     uint8_t test_pairing_random_command[] ={0x04, 0xfd, 0xd4, 0x06, 0x45, 0x0f, 0x1e, 0xdc, 0x84, 0xd5, 0x43, 0xac, 0xf7, 0x5e, 0xc0, 0x36, 0x29};
321     mock_simulate_sm_data_packet(&test_pairing_random_command[0], sizeof(test_pairing_random_command));
322 
323 #ifdef ENABLE_SOFTWARE_AES128
324     // process sm_run_trigger()
325     btstack_run_loop_embedded_execute_once();
326 #else
327     // expect le encrypt command
328     CHECK_HCI_COMMAND(test_command_packet_09);
329     aes128_report_result();
330 
331     // expect le encrypt command
332     CHECK_HCI_COMMAND(test_command_packet_10);
333     aes128_report_result();
334 #endif
335 
336     // expect send pairing random command
337     CHECK_ACL_PACKET(test_acl_packet_11);
338 
339     // NOTE: SM also triggered for wrong handle
340 
341 	uint8_t test_le_ltk_request[] = { 0x3e, 0x0d, 0x05, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 00 };
342 	mock_simulate_hci_event(&test_le_ltk_request[0], sizeof(test_le_ltk_request));
343 
344 #ifdef ENABLE_SOFTWARE_AES128
345     // process sm_run_trigger()
346     btstack_run_loop_embedded_execute_once();
347 #else
348 	// expect le encrypt command
349     CHECK_HCI_COMMAND(test_command_packet_12);
350     aes128_report_result();
351 #endif
352 
353 	// expect le ltk reply
354     CHECK_HCI_COMMAND(test_command_packet_13);
355 
356 	uint8_t test_ecnryption_change_event[] = { 0x08, 0x04, 0x00, 0x40, 0x00, 0x01 };
357 	mock_simulate_hci_event(&test_ecnryption_change_event[0], sizeof(test_ecnryption_change_event));
358 
359     // expect le random command
360     CHECK_HCI_COMMAND(test_command_packet_14);
361 
362     uint8_t rand3_data_event[] = { 0x0e, 0x0c, 0x01, 0x18, 0x20, 0x00, 0xc0, 0x10, 0x70, 0x5f, 0x3c, 0x2d, 0xe3, 0xb3 };
363 	mock_simulate_hci_event(&rand3_data_event[0], sizeof(rand3_data_event));
364 
365     // expect le random command
366     CHECK_HCI_COMMAND(test_command_packet_15);
367 
368     uint8_t rand4_data_event[] = { 0x0e, 0x0c, 0x01, 0x18, 0x20, 0x00, 0xf1, 0xe2, 0xbf, 0x7d, 0x84, 0x19, 0x32, 0x8b };
369 	mock_simulate_hci_event(&rand4_data_event[0], sizeof(rand4_data_event));
370 
371 #ifdef ENABLE_SOFTWARE_AES128
372     // process sm_run_trigger()
373     btstack_run_loop_embedded_execute_once();
374 #else
375 	// expect le encrypt command
376     CHECK_HCI_COMMAND(test_command_packet_16);
377     aes128_report_result();
378 
379 	// expect le encrypt command
380     CHECK_HCI_COMMAND(test_command_packet_17);
381     aes128_report_result();
382 
383 	// expect le encrypt command
384     CHECK_HCI_COMMAND(test_command_packet_18);
385     aes128_report_result();
386 #endif
387 
388     //
389 	uint8_t num_completed_packets_event[] = { 0x13, 0x05, 0x01, 0x4a, 0x00, 0x01, 00 };
390 
391     // expect send LE SMP Encryption Information Command
392     CHECK_ACL_PACKET(test_acl_packet_18);
393 
394 	mock_simulate_hci_event(&num_completed_packets_event[0], sizeof(num_completed_packets_event));
395 
396     // expect send LE SMP Master Identification Command
397     CHECK_ACL_PACKET(test_acl_packet_19);
398 
399 	mock_simulate_hci_event(&num_completed_packets_event[0], sizeof(num_completed_packets_event));
400 
401 	// expect send LE SMP Identity Information Command
402     CHECK_ACL_PACKET(test_acl_packet_20);
403 
404 	mock_simulate_hci_event(&num_completed_packets_event[0], sizeof(num_completed_packets_event));
405 
406 	// expect send LE SMP Identity Address Information Command
407     CHECK_ACL_PACKET(test_acl_packet_21);
408 
409 	mock_simulate_hci_event(&num_completed_packets_event[0], sizeof(num_completed_packets_event));
410 
411 	// expect send LE SMP Code Signing Information Command
412     CHECK_ACL_PACKET(test_acl_packet_22);
413 }
414 
415 int main (int argc, const char * argv[]){
416     // log into file using HCI_DUMP_PACKETLOGGER format
417     const char * log_path = "hci_dump.pklg";
418     hci_dump_posix_fs_open(log_path, HCI_DUMP_PACKETLOGGER);
419     hci_dump_init(hci_dump_posix_fs_get_instance());
420     printf("Packet Log: %s\n", log_path);
421 
422     return CommandLineTestRunner::RunAllTests(argc, argv);
423 }
424