xref: /btstack/test/security_manager/security_manager.cpp (revision 6897da5c53aac5b1f90f41b5b15d0bd43d61dfff)
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 
217 bool get_ltk_callback(hci_con_handle_t con_handle, uint8_t address_type, bd_addr_t addr, uint8_t * ltk){
218     UNUSED(con_handle);
219     UNUSED(address_type);
220     UNUSED(addr);
221     UNUSED(ltk);
222 
223     return true;
224 }
225 
226 
227 TEST_GROUP(SecurityManager){
228 	void setup(void){
229         static int first = 1;
230         if (first){
231             first = 0;
232             btstack_memory_init();
233             btstack_run_loop_init(btstack_run_loop_embedded_get_instance());
234         }
235 	    sm_init();
236 	    sm_set_io_capabilities(IO_CAPABILITY_NO_INPUT_NO_OUTPUT);
237 	    sm_set_authentication_requirements( SM_AUTHREQ_BONDING );
238         sm_event_callback_registration.callback = &app_packet_handler;
239         sm_add_event_handler(&sm_event_callback_registration);
240 
241 
242         // log into file using HCI_DUMP_PACKETLOGGER format
243         const char * log_path = "hci_dump.pklg";
244         hci_dump_posix_fs_open(log_path, HCI_DUMP_PACKETLOGGER);
245         hci_dump_init(hci_dump_posix_fs_get_instance());
246         printf("Packet Log: %s\n", log_path);
247     }
248 };
249 
250 TEST(SecurityManager, CallFunctions){
251     sm_register_ltk_callback(&get_ltk_callback);
252     sm_remove_event_handler(NULL);
253     sm_set_accepted_stk_generation_methods(0);
254     sm_set_encryption_key_size_range(16, 128);
255 #ifdef ENABLE_LE_PERIPHERAL
256     sm_set_request_security(true);
257 #endif
258     sm_key_t key = {1,2,3,4,5,6,7,8,8,10,11,12,13,14,15,16};
259     sm_set_er(key);
260     sm_set_ir(key);
261     sm_test_set_irk(key);
262     sm_test_use_fixed_local_csrk();
263     sm_use_fixed_passkey_in_display_role(1000);
264     sm_allow_ltk_reconstruction_without_le_device_db_entry(1);
265     sm_numeric_comparison_confirm(HCI_CON_HANDLE_INVALID);
266     sm_send_security_request(HCI_CON_HANDLE_INVALID);
267     gap_get_persistent_irk();
268     bd_addr_t address = {0,0,0,0,0,0};
269     gap_delete_bonding(BD_ADDR_TYPE_UNKNOWN, address);
270     sm_identity_resolving_state(HCI_CON_HANDLE_INVALID);
271     sm_authorization_decline(HCI_CON_HANDLE_INVALID);
272     sm_request_pairing(HCI_CON_HANDLE_INVALID);
273 }
274 
275 TEST(SecurityManager, MainTest){
276 
277     mock_init();
278     mock_simulate_hci_state_working();
279 
280 #ifdef ENABLE_LE_SECURE_CONNECTIONS
281 	// on start, new ECC Key is generated
282 #ifdef ENABLE_MICRO_ECC_FOR_LE_SECURE_CONNECTIONS
283     // with uECC, this requires to get some random data
284     int i;
285     for (i=0;i<8;i++){
286 		CHECK_HCI_COMMAND(test_command_packet_04);
287 		uint8_t rand_sc_1_data_event[] = { 0x0e, 0x0c, 0x01, 0x18, 0x20, 0x00, 0x2f, 0x04, 0x82, 0x84, 0x72, 0x46, 0x9c, 0x93 };
288 		mock_simulate_hci_event(&rand_sc_1_data_event[0], sizeof(rand_sc_1_data_event));
289     }
290 #else
291 	// with Controller support, the stack will read public key
292 	CHECK_HCI_COMMAND(test_command_packet_sc_read_public_key);
293 	uint8_t read_public_key_event[] = {
294 			0x3E, 0x42, 0x08, 0x00, 0xD1, 0xD2, 0x7C, 0xF7, 0x08, 0x34, 0xC8, 0x19, 0xEC, 0x92, 0x39, 0x8D,
295 			0x55, 0xE7, 0xAB, 0x25, 0xDE, 0x7B, 0x32, 0x05, 0x64, 0xA8, 0x90, 0xA7, 0xE6, 0x52, 0x7B, 0x41,
296 			0x29, 0x14, 0xA3, 0xAE, 0x73, 0xC9, 0x57, 0x20, 0xA8, 0x5F, 0xFE, 0xE7, 0xC1, 0x27, 0xDE, 0x7D,
297 			0xB7, 0x25, 0xB0, 0xC1, 0x9E, 0x1F, 0xFE, 0xD1, 0xF0, 0x21, 0x22, 0x7E, 0x1F, 0xF4, 0x5D, 0x07,
298 			0x6D, 0x6F, 0x12, 0x06
299 	};
300 	mock_simulate_hci_event(&read_public_key_event[0], sizeof(read_public_key_event));
301 #endif
302 #endif
303 
304 #ifndef ENABLE_SOFTWARE_AES128
305     // expect le encrypt commmand
306     CHECK_HCI_COMMAND(test_command_packet_01);
307     aes128_report_result();
308 
309     // expect le encrypt commmand
310     CHECK_HCI_COMMAND(test_command_packet_02);
311     aes128_report_result();
312 #endif
313 
314 	mock_clear_packet_buffer();
315 
316     mock_simulate_connected();
317 
318     uint8_t test_pairing_request_command[] = { 0x01, 0x04, 0x00, 0x01, 0x10, 0x07, 0x07 };
319     mock_simulate_sm_data_packet(&test_pairing_request_command[0], sizeof(test_pairing_request_command));
320 
321     // expect send pairing response command
322     CHECK_ACL_PACKET(test_acl_packet_03);
323 
324     uint8_t test_pairing_confirm_command[] = { 0x03, 0x84, 0x5a, 0x87, 0x9a, 0x0f, 0xa9, 0x42, 0xba, 0x48, 0xc5, 0x79, 0xa0, 0x70, 0x70, 0xa9, 0xc8 };
325     mock_simulate_sm_data_packet(&test_pairing_confirm_command[0], sizeof(test_pairing_confirm_command));
326 
327     // expect le random command
328     CHECK_HCI_COMMAND(test_command_packet_04);
329 
330     uint8_t rand1_data_event[] = { 0x0e, 0x0c, 0x01, 0x18, 0x20, 0x00, 0x2f, 0x04, 0x82, 0x84, 0x72, 0x46, 0x9c, 0x93 };
331 	mock_simulate_hci_event(&rand1_data_event[0], sizeof(rand1_data_event));
332 
333     // expect le random command
334     CHECK_HCI_COMMAND(test_command_packet_05);
335 
336     uint8_t rand2_data_event[] = { 0x0e, 0x0c,0x01, 0x18,0x20, 0x00,0x48, 0x3f,0x27, 0x0e,0xeb, 0xd5,0x05, 0x7a };
337 	mock_simulate_hci_event(&rand2_data_event[0], sizeof(rand2_data_event));
338 
339 #ifdef ENABLE_SOFTWARE_AES128
340 	// process sm_run_trigger()
341     btstack_run_loop_embedded_execute_once();
342 #else
343     // expect le encrypt command
344     CHECK_HCI_COMMAND(test_command_packet_06);
345     aes128_report_result();
346 
347     // expect le encrypt command
348     CHECK_HCI_COMMAND(test_command_packet_07);
349     aes128_report_result();
350 #endif
351 
352 
353     // expect send pairing confirm command
354     CHECK_ACL_PACKET(test_acl_packet_08);
355 
356     uint8_t test_pairing_random_command[] ={0x04, 0xfd, 0xd4, 0x06, 0x45, 0x0f, 0x1e, 0xdc, 0x84, 0xd5, 0x43, 0xac, 0xf7, 0x5e, 0xc0, 0x36, 0x29};
357     mock_simulate_sm_data_packet(&test_pairing_random_command[0], sizeof(test_pairing_random_command));
358 
359 #ifdef ENABLE_SOFTWARE_AES128
360     // process sm_run_trigger()
361     btstack_run_loop_embedded_execute_once();
362 #else
363     // expect le encrypt command
364     CHECK_HCI_COMMAND(test_command_packet_09);
365     aes128_report_result();
366 
367     // expect le encrypt command
368     CHECK_HCI_COMMAND(test_command_packet_10);
369     aes128_report_result();
370 #endif
371 
372     // expect send pairing random command
373     CHECK_ACL_PACKET(test_acl_packet_11);
374 
375     // NOTE: SM also triggered for wrong handle
376 
377 	uint8_t test_le_ltk_request[] = { 0x3e, 0x0d, 0x05, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 00 };
378 	mock_simulate_hci_event(&test_le_ltk_request[0], sizeof(test_le_ltk_request));
379 
380 #ifdef ENABLE_SOFTWARE_AES128
381     // process sm_run_trigger()
382     btstack_run_loop_embedded_execute_once();
383 #else
384 	// expect le encrypt command
385     CHECK_HCI_COMMAND(test_command_packet_12);
386     aes128_report_result();
387 #endif
388 
389 	// expect le ltk reply
390     CHECK_HCI_COMMAND(test_command_packet_13);
391 
392 	uint8_t test_ecnryption_change_event[] = { 0x08, 0x04, 0x00, 0x40, 0x00, 0x01 };
393 	mock_simulate_hci_event(&test_ecnryption_change_event[0], sizeof(test_ecnryption_change_event));
394 
395     // expect le random command
396     CHECK_HCI_COMMAND(test_command_packet_14);
397 
398     uint8_t rand3_data_event[] = { 0x0e, 0x0c, 0x01, 0x18, 0x20, 0x00, 0xc0, 0x10, 0x70, 0x5f, 0x3c, 0x2d, 0xe3, 0xb3 };
399 	mock_simulate_hci_event(&rand3_data_event[0], sizeof(rand3_data_event));
400 
401     // expect le random command
402     CHECK_HCI_COMMAND(test_command_packet_15);
403 
404     uint8_t rand4_data_event[] = { 0x0e, 0x0c, 0x01, 0x18, 0x20, 0x00, 0xf1, 0xe2, 0xbf, 0x7d, 0x84, 0x19, 0x32, 0x8b };
405 	mock_simulate_hci_event(&rand4_data_event[0], sizeof(rand4_data_event));
406 
407 #ifdef ENABLE_SOFTWARE_AES128
408     // process sm_run_trigger()
409     btstack_run_loop_embedded_execute_once();
410 #else
411 	// expect le encrypt command
412     CHECK_HCI_COMMAND(test_command_packet_16);
413     aes128_report_result();
414 
415 	// expect le encrypt command
416     CHECK_HCI_COMMAND(test_command_packet_17);
417     aes128_report_result();
418 
419 	// expect le encrypt command
420     CHECK_HCI_COMMAND(test_command_packet_18);
421     aes128_report_result();
422 #endif
423 
424     //
425 	uint8_t num_completed_packets_event[] = { 0x13, 0x05, 0x01, 0x4a, 0x00, 0x01, 00 };
426 
427     // expect send LE SMP Encryption Information Command
428     CHECK_ACL_PACKET(test_acl_packet_18);
429 
430 	mock_simulate_hci_event(&num_completed_packets_event[0], sizeof(num_completed_packets_event));
431 
432     // expect send LE SMP Master Identification Command
433     CHECK_ACL_PACKET(test_acl_packet_19);
434 
435 	mock_simulate_hci_event(&num_completed_packets_event[0], sizeof(num_completed_packets_event));
436 
437 	// expect send LE SMP Identity Information Command
438     CHECK_ACL_PACKET(test_acl_packet_20);
439 
440 	mock_simulate_hci_event(&num_completed_packets_event[0], sizeof(num_completed_packets_event));
441 
442 	// expect send LE SMP Identity Address Information Command
443     CHECK_ACL_PACKET(test_acl_packet_21);
444 
445 	mock_simulate_hci_event(&num_completed_packets_event[0], sizeof(num_completed_packets_event));
446 
447 	// expect send LE SMP Code Signing Information Command
448     CHECK_ACL_PACKET(test_acl_packet_22);
449 }
450 
451 TEST(SecurityManager, AddressResolutionLookup){
452     int status;
453     bd_addr_t address = {0,0,0,0,0,0};
454 
455     status = sm_address_resolution_lookup((uint8_t) BD_ADDR_TYPE_LE_PUBLIC, address);
456     CHECK_EQUAL(status, 0);
457 }
458 
459 int main (int argc, const char * argv[]){
460     // log into file using HCI_DUMP_PACKETLOGGER format
461     const char * log_path = "hci_dump.pklg";
462     hci_dump_posix_fs_open(log_path, HCI_DUMP_PACKETLOGGER);
463     hci_dump_init(hci_dump_posix_fs_get_instance());
464     printf("Packet Log: %s\n", log_path);
465 
466     return CommandLineTestRunner::RunAllTests(argc, argv);
467 }
468