xref: /btstack/test/mesh/mesh_message_test.cpp (revision 1aa2a11e65fdd1e3d19a91f4efee1d410180766b)
1 #include <stdio.h>
2 
3 #include "CppUTest/TestHarness.h"
4 #include "CppUTest/CommandLineTestRunner.h"
5 
6 #include "bluetooth_data_types.h"
7 #include "bluetooth_gatt.h"
8 #include "btstack_debug.h"
9 #include "btstack_memory.h"
10 #include "btstack_util.h"
11 #include "mesh/adv_bearer.h"
12 #include "mesh/gatt_bearer.h"
13 #include "mesh/mesh_access.h"
14 #include "mesh/mesh_crypto.h"
15 #include "mesh/mesh_foundation.h"
16 #include "mesh/mesh_iv_index_seq_number.h"
17 #include "mesh/mesh_lower_transport.h"
18 #include "mesh/mesh_network.h"
19 #include "mesh/mesh_upper_transport.h"
20 #include "mesh/provisioning.h"
21 #include "mesh/mesh_peer.h"
22 
23 extern "C" int mock_process_hci_cmd(void);
24 
25 static mesh_network_pdu_t * received_network_pdu;
26 static mesh_network_pdu_t * received_proxy_pdu;
27 
28 static uint8_t outgoing_gatt_network_pdu_data[29];
29 static uint8_t outgoing_gatt_network_pdu_len;
30 
31 static uint8_t outgoing_adv_network_pdu_data[29];
32 static uint8_t outgoing_adv_network_pdu_len;
33 
34 static uint8_t  recv_upper_transport_pdu_data[100];
35 static uint16_t recv_upper_transport_pdu_len;
36 
37 #ifdef ENABLE_MESH_ADV_BEARER
38 static btstack_packet_handler_t adv_packet_handler;
39 void adv_bearer_register_for_network_pdu(btstack_packet_handler_t packet_handler){
40     adv_packet_handler = packet_handler;
41 }
42 void adv_bearer_request_can_send_now_for_network_pdu(void){
43     // simulate can send now
44     uint8_t event[3];
45     event[0] = HCI_EVENT_MESH_META;
46     event[1] = 1;
47     event[2] = MESH_SUBEVENT_CAN_SEND_NOW;
48     (*adv_packet_handler)(HCI_EVENT_PACKET, 0, &event[0], sizeof(event));
49 }
50 void adv_bearer_send_network_pdu(const uint8_t * network_pdu, uint16_t size, uint8_t count, uint16_t interval){
51     (void) count;
52     (void) interval;
53     // printf("ADV Network PDU: ");
54     // printf_hexdump(network_pdu, size);
55     memcpy(outgoing_adv_network_pdu_data, network_pdu, size);
56     outgoing_adv_network_pdu_len = size;
57 }
58 static void adv_bearer_emit_sent(void){
59     uint8_t event[3];
60     event[0] = HCI_EVENT_MESH_META;
61     event[1] = 1;
62     event[2] = MESH_SUBEVENT_MESSAGE_SENT;
63     (*adv_packet_handler)(HCI_EVENT_PACKET, 0, &event[0], sizeof(event));
64 }
65 #endif
66 
67 #ifdef ENABLE_MESH_GATT_BEARER
68 static btstack_packet_handler_t gatt_packet_handler;
69 void gatt_bearer_register_for_network_pdu(btstack_packet_handler_t packet_handler){
70     gatt_packet_handler = packet_handler;
71 }
72 void gatt_bearer_register_for_mesh_proxy_configuration(btstack_packet_handler_t packet_handler){
73 }
74 void gatt_bearer_request_can_send_now_for_network_pdu(void){
75     // simulate can send now
76     uint8_t event[3];
77     event[0] = HCI_EVENT_MESH_META;
78     event[1] = 1;
79     event[2] = MESH_SUBEVENT_CAN_SEND_NOW;
80     (*gatt_packet_handler)(HCI_EVENT_PACKET, 0, &event[0], sizeof(event));
81 }
82 void gatt_bearer_send_network_pdu(const uint8_t * network_pdu, uint16_t size){
83     // printf("ADV Network PDU: ");
84     // printf_hexdump(network_pdu, size);
85     memcpy(outgoing_gatt_network_pdu_data, network_pdu, size);
86     outgoing_gatt_network_pdu_len = size;
87 }
88 static void gatt_bearer_emit_sent(void){
89     uint8_t event[3];
90     event[0] = HCI_EVENT_MESH_META;
91     event[1] = 1;
92     event[2] = MESH_SUBEVENT_MESSAGE_SENT;
93     (*gatt_packet_handler)(HCI_EVENT_PACKET, 0, &event[0], sizeof(event));
94 }
95 static void gatt_bearer_emit_connected(void){
96     uint8_t event[5];
97     event[0] = HCI_EVENT_MESH_META;
98     event[1] = 1;
99     event[2] = MESH_SUBEVENT_PROXY_CONNECTED;
100     little_endian_store_16(event, 3, 0x1234);
101     (*gatt_packet_handler)(HCI_EVENT_PACKET, 0, &event[0], sizeof(event));
102 }
103 #endif
104 
105 // copy from mesh_message.c for now
106 uint16_t mesh_pdu_dst(mesh_pdu_t * pdu){
107     switch (pdu->pdu_type){
108         case MESH_PDU_TYPE_TRANSPORT:
109             return mesh_transport_dst((mesh_transport_pdu_t*) pdu);
110         case MESH_PDU_TYPE_NETWORK:
111             return mesh_network_dst((mesh_network_pdu_t *) pdu);
112         default:
113             return MESH_ADDRESS_UNSASSIGNED;
114     }
115 }
116 uint16_t mesh_pdu_ctl(mesh_pdu_t * pdu){
117     switch (pdu->pdu_type){
118         case MESH_PDU_TYPE_TRANSPORT:
119             return mesh_transport_ctl((mesh_transport_pdu_t*) pdu);
120         case MESH_PDU_TYPE_NETWORK:
121             return mesh_network_control((mesh_network_pdu_t *) pdu);
122         default:
123             return 0;
124     }
125 }
126 
127 void CHECK_EQUAL_ARRAY(uint8_t * expected, uint8_t * actual, int size){
128     int i;
129     for (i=0; i<size; i++){
130         if (expected[i] != actual[i]) {
131             printf("offset %u wrong\n", i);
132             printf("expected: "); printf_hexdump(expected, size);
133             printf("actual:   "); printf_hexdump(actual, size);
134         }
135         BYTES_EQUAL(expected[i], actual[i]);
136     }
137 }
138 
139 static int scan_hex_byte(const char * byte_string){
140     int upper_nibble = nibble_for_char(*byte_string++);
141     if (upper_nibble < 0) return -1;
142     int lower_nibble = nibble_for_char(*byte_string);
143     if (lower_nibble < 0) return -1;
144     return (upper_nibble << 4) | lower_nibble;
145 }
146 
147 static int btstack_parse_hex(const char * string, uint16_t len, uint8_t * buffer){
148     int i;
149     for (i = 0; i < len; i++) {
150         int single_byte = scan_hex_byte(string);
151         if (single_byte < 0) return 0;
152         string += 2;
153         buffer[i] = (uint8_t)single_byte;
154         // don't check seperator after last byte
155         if (i == len - 1) {
156             return 1;
157         }
158         // optional seperator
159         char separator = *string;
160         if (separator == ':' && separator == '-' && separator == ' ') {
161             string++;
162         }
163     }
164     return 1;
165 }
166 
167 #if 0
168 static void btstack_print_hex(const uint8_t * data, uint16_t len, char separator){
169     int i;
170     for (i=0;i<len;i++){
171         printf("%02x", data[i]);
172         if (separator){
173             printf("%c", separator);
174         }
175     }
176     printf("\n");
177 }
178 #endif
179 
180 static mesh_transport_key_t   test_application_key;
181 static void mesh_application_key_set(uint16_t netkey_index, uint16_t appkey_index, uint8_t aid, const uint8_t *application_key) {
182     test_application_key.netkey_index = netkey_index;
183     test_application_key.appkey_index = appkey_index;
184     test_application_key.aid   = aid;
185     test_application_key.akf   = 1;
186     memcpy(test_application_key.key, application_key, 16);
187     mesh_transport_key_add(&test_application_key);
188 }
189 
190 static void load_network_key_nid_68(void){
191     mesh_network_key_t * network_key = btstack_memory_mesh_network_key_get();
192     network_key->nid = 0x68;
193     btstack_parse_hex("0953fa93e7caac9638f58820220a398e", 16, network_key->encryption_key);
194     btstack_parse_hex("8b84eedec100067d670971dd2aa700cf", 16, network_key->privacy_key);
195     mesh_network_key_add(network_key);
196     mesh_subnet_setup_for_netkey_index(network_key->netkey_index);
197 }
198 
199 static void load_network_key_nid_5e(void){
200     mesh_network_key_t * network_key = btstack_memory_mesh_network_key_get();
201     network_key->nid = 0x5e;
202     btstack_parse_hex("be635105434859f484fc798e043ce40e", 16, network_key->encryption_key);
203     btstack_parse_hex("5d396d4b54d3cbafe943e051fe9a4eb8", 16, network_key->privacy_key);
204     mesh_network_key_add(network_key);
205     mesh_subnet_setup_for_netkey_index(network_key->netkey_index);
206 }
207 
208 static void load_network_key_nid_10(void){
209     mesh_network_key_t * network_key = btstack_memory_mesh_network_key_get();
210     network_key->nid = 0x10;
211     btstack_parse_hex("3a4fe84a6cc2c6a766ea93f1084d4039", 16, network_key->encryption_key);
212     btstack_parse_hex("f695fcce709ccface4d8b7a1e6e39d25", 16, network_key->privacy_key);
213     mesh_network_key_add(network_key);
214     mesh_subnet_setup_for_netkey_index(network_key->netkey_index);
215 }
216 
217 static void load_provisioning_data_test_message(void){
218     uint8_t application_key[16];
219     btstack_parse_hex("63964771734fbd76e3b40519d1d94a48", 16, application_key);
220     mesh_application_key_set( 0, 0, 0x26, application_key);
221 
222     uint8_t device_key[16];
223     btstack_parse_hex("9d6dd0e96eb25dc19a40ed9914f8f03f", 16, device_key);
224     mesh_transport_set_device_key(device_key);
225 }
226 
227 static void test_lower_transport_callback_handler(mesh_network_callback_type_t callback_type, mesh_network_pdu_t * network_pdu){
228     switch (callback_type){
229         case MESH_NETWORK_PDU_RECEIVED:
230         printf("test MESH_NETWORK_PDU_RECEIVED\n");
231             received_network_pdu = network_pdu;
232             break;
233         case MESH_NETWORK_PDU_SENT:
234             printf("test MESH_NETWORK_PDU_SENT\n");
235             mesh_lower_transport_received_message(MESH_NETWORK_PDU_SENT, network_pdu);
236             break;
237         default:
238             break;
239     }
240 }
241 
242 static void test_proxy_server_callback_handler(mesh_network_callback_type_t callback_type, mesh_network_pdu_t * network_pdu){
243     switch (callback_type){
244         case MESH_NETWORK_PDU_RECEIVED:
245             printf("test MESH_PROXY_PDU_RECEIVED\n");
246             received_proxy_pdu = network_pdu;
247             break;
248         case MESH_NETWORK_PDU_SENT:
249             // printf("test MESH_PROXY_PDU_SENT\n");
250             // mesh_lower_transport_received_mesage(MESH_NETWORK_PDU_SENT, network_pdu);
251             break;
252         case MESH_NETWORK_PDU_ENCRYPTED:
253             printf("test MESH_NETWORK_PDU_ENCRYPTED\n");
254             received_proxy_pdu = network_pdu;
255             break;
256         default:
257             break;
258     }
259 }
260 
261 static void test_upper_transport_access_message_handler(mesh_pdu_t * pdu){
262     mesh_transport_pdu_t * transport_pdu;
263     mesh_network_pdu_t   * network_pdu;
264     mesh_message_pdu_t   * message_pdu;
265     switch(pdu->pdu_type){
266         case MESH_PDU_TYPE_TRANSPORT:
267             transport_pdu = (mesh_transport_pdu_t *) pdu;
268             printf("test MESH_ACCESS_TRANSPORT_PDU_RECEIVED\n");
269             recv_upper_transport_pdu_len = transport_pdu->len;
270             memcpy(recv_upper_transport_pdu_data, transport_pdu->data, recv_upper_transport_pdu_len);
271             mesh_upper_transport_message_processed_by_higher_layer(pdu);
272             break;
273         case MESH_PDU_TYPE_NETWORK:
274             btstack_assert(0);
275             break;
276         case MESH_PDU_TYPE_MESSAGE:
277             message_pdu = (mesh_message_pdu_t *) pdu;
278             printf("test MESH_PDU_TYPE_MESSAGE\n");
279             network_pdu = (mesh_network_pdu_t *) btstack_linked_list_get_first_item(&message_pdu->segments);
280             recv_upper_transport_pdu_len = mesh_network_pdu_len(network_pdu)  - 1;
281             memcpy(recv_upper_transport_pdu_data, mesh_network_pdu_data(network_pdu) + 1, recv_upper_transport_pdu_len);
282             mesh_upper_transport_message_processed_by_higher_layer(pdu);
283             break;
284         default:
285             break;
286     }
287 }
288 
289 static void test_upper_transport_control_message_handler(mesh_pdu_t * pdu){
290     mesh_transport_pdu_t * transport_pdu;
291     mesh_network_pdu_t   * network_pdu;
292     switch(pdu->pdu_type){
293         case MESH_PDU_TYPE_TRANSPORT:
294             transport_pdu = (mesh_transport_pdu_t *) pdu;
295             printf("test MESH_CONTROL_TRANSPORT_PDU_RECEIVED\n");
296             recv_upper_transport_pdu_len = transport_pdu->len;
297             memcpy(recv_upper_transport_pdu_data, transport_pdu->data, recv_upper_transport_pdu_len);
298             mesh_upper_transport_message_processed_by_higher_layer(pdu);
299             break;
300         case MESH_PDU_TYPE_NETWORK:
301             network_pdu = (mesh_network_pdu_t *) pdu;
302             printf("test MESH_CONTROL_NETWORK_PDU_RECEIVED\n");
303             recv_upper_transport_pdu_len = mesh_network_pdu_len(network_pdu);
304             memcpy(recv_upper_transport_pdu_data, mesh_network_pdu_data(network_pdu), recv_upper_transport_pdu_len);
305             mesh_upper_transport_message_processed_by_higher_layer(pdu);
306             break;
307         default:
308             break;
309     }
310 }
311 
312 TEST_GROUP(MessageTest){
313     void setup(void){
314         btstack_memory_init();
315         btstack_crypto_init();
316         load_provisioning_data_test_message();
317         mesh_network_init();
318         mesh_lower_transport_init();
319         mesh_upper_transport_init();
320         mesh_network_key_init();
321         // intercept messages between network and lower layer
322         mesh_network_set_higher_layer_handler(&test_lower_transport_callback_handler);
323         mesh_network_set_proxy_message_handler(&test_proxy_server_callback_handler);
324         // register to receive upper transport messages
325         mesh_upper_transport_register_access_message_handler(&test_upper_transport_access_message_handler);
326         mesh_upper_transport_register_control_message_handler(&test_upper_transport_control_message_handler);
327         mesh_seq_auth_reset();
328 #ifdef ENABLE_MESH_GATT_BEARER
329         mesh_foundation_gatt_proxy_set(1);
330         gatt_bearer_emit_connected();
331 #endif
332         outgoing_gatt_network_pdu_len = 0;
333         outgoing_adv_network_pdu_len = 0;
334         received_network_pdu = NULL;
335         recv_upper_transport_pdu_len =0;
336     }
337     void teardown(void){
338         // printf("-- teardown start --\n\n");
339         btstack_crypto_reset();
340         mesh_network_reset();
341         mesh_lower_transport_reset();
342         mesh_upper_transport_dump();
343         mesh_upper_transport_reset();
344         // mesh_network_dump();
345         // mesh_transport_dump();
346         printf("-- teardown complete --\n\n");
347     }
348 };
349 
350 static uint8_t transport_pdu_data[64];
351 static uint16_t transport_pdu_len;
352 
353 static     uint8_t test_network_pdu_len;
354 static uint8_t test_network_pdu_data[29];
355 
356 void test_receive_network_pdus(int count, char ** network_pdus, char ** lower_transport_pdus, char * access_pdu){
357     int i;
358     for (i=0;i<count;i++){
359         test_network_pdu_len = strlen(network_pdus[i]) / 2;
360         btstack_parse_hex(network_pdus[i], test_network_pdu_len, test_network_pdu_data);
361 
362         mesh_network_received_message(test_network_pdu_data, test_network_pdu_len, 0);
363 
364         while (received_network_pdu == NULL) {
365             mock_process_hci_cmd();
366         }
367 
368         transport_pdu_len = strlen(lower_transport_pdus[i]) / 2;
369         btstack_parse_hex(lower_transport_pdus[i], transport_pdu_len, transport_pdu_data);
370 
371         uint8_t * lower_transport_pdu     = mesh_network_pdu_data(received_network_pdu);
372         uint8_t   lower_transport_pdu_len = mesh_network_pdu_len(received_network_pdu);
373 
374         // printf_hexdump(lower_transport_pdu, lower_transport_pdu_len);
375 
376         CHECK_EQUAL( transport_pdu_len, lower_transport_pdu_len);
377         CHECK_EQUAL_ARRAY(transport_pdu_data, lower_transport_pdu, transport_pdu_len);
378 
379         // forward to mesh_transport
380         mesh_lower_transport_received_message(MESH_NETWORK_PDU_RECEIVED, received_network_pdu);
381 
382         // done
383         received_network_pdu = NULL;
384     }
385 
386     // wait for tranport pdu
387     while (recv_upper_transport_pdu_len == 0) {
388         mock_process_hci_cmd();
389     }
390 
391     transport_pdu_len = strlen(access_pdu) / 2;
392     btstack_parse_hex(access_pdu, transport_pdu_len, transport_pdu_data);
393 
394     printf("UpperTransportPDU: ");
395     printf_hexdump(recv_upper_transport_pdu_data, recv_upper_transport_pdu_len);
396     CHECK_EQUAL( transport_pdu_len, recv_upper_transport_pdu_len);
397     CHECK_EQUAL_ARRAY(transport_pdu_data, recv_upper_transport_pdu_data, transport_pdu_len);
398 }
399 
400 static void expect_gatt_network_pdu(const uint8_t * data, uint16_t len){
401         while (outgoing_gatt_network_pdu_len == 0) {
402             mock_process_hci_cmd();
403         }
404 
405         if (outgoing_gatt_network_pdu_len != test_network_pdu_len){
406             printf("Test Network PDU (%u): ", outgoing_gatt_network_pdu_len); printf_hexdump(outgoing_gatt_network_pdu_data, outgoing_gatt_network_pdu_len);
407             printf("Expected     PDU (%u): ", test_network_pdu_len); printf_hexdump(test_network_pdu_data, test_network_pdu_len);
408         }
409         CHECK_EQUAL( outgoing_gatt_network_pdu_len, test_network_pdu_len);
410         CHECK_EQUAL_ARRAY(test_network_pdu_data, outgoing_gatt_network_pdu_data, test_network_pdu_len);
411 
412         outgoing_gatt_network_pdu_len = 0;
413         gatt_bearer_emit_sent();
414 }
415 
416 static void expect_adv_network_pdu(const uint8_t * data, uint16_t len){
417         while (outgoing_adv_network_pdu_len == 0) {
418             mock_process_hci_cmd();
419         }
420 
421         if (outgoing_adv_network_pdu_len != test_network_pdu_len){
422             printf("Test Network PDU (%u): ", outgoing_adv_network_pdu_len); printf_hexdump(outgoing_adv_network_pdu_data, outgoing_adv_network_pdu_len);
423             printf("Expected     PDU (%u): ", test_network_pdu_len); printf_hexdump(test_network_pdu_data, test_network_pdu_len);
424         }
425         CHECK_EQUAL( outgoing_adv_network_pdu_len, test_network_pdu_len);
426         CHECK_EQUAL_ARRAY(test_network_pdu_data, outgoing_adv_network_pdu_data, test_network_pdu_len);
427 
428         outgoing_adv_network_pdu_len = 0;
429         adv_bearer_emit_sent();
430 }
431 
432 void test_send_access_message(uint16_t netkey_index, uint16_t appkey_index,  uint8_t ttl, uint16_t src, uint16_t dest, uint8_t szmic, char * control_pdu, int count, char ** lower_transport_pdus, char ** network_pdus){
433 
434     transport_pdu_len = strlen(control_pdu) / 2;
435     btstack_parse_hex(control_pdu, transport_pdu_len, transport_pdu_data);
436 
437     mesh_pdu_t * pdu;
438     if (count == 1 ){
439         // send as unsegmented access pdu
440         mesh_message_pdu_t * message_pdu = mesh_message_pdu_get();
441         mesh_network_pdu_t * segment     = mesh_network_pdu_get();
442         btstack_linked_list_add(&message_pdu->segments, (btstack_linked_item_t *) segment);
443         pdu = (mesh_pdu_t*) message_pdu;
444     } else {
445         // send as segmented access pdu
446         pdu = (mesh_pdu_t*) mesh_transport_pdu_get();
447     }
448     mesh_upper_transport_setup_access_pdu(pdu, netkey_index, appkey_index, ttl, src, dest, szmic, transport_pdu_data, transport_pdu_len);
449     mesh_upper_transport_send_access_pdu(pdu);
450 
451     // check for all network pdus
452     int i;
453     for (i=0;i<count;i++){
454         // parse expected network pdu
455         test_network_pdu_len = strlen(network_pdus[i]) / 2;
456         btstack_parse_hex(network_pdus[i], test_network_pdu_len, test_network_pdu_data);
457 
458 #ifdef ENABLE_MESH_GATT_BEARER
459         expect_gatt_network_pdu(test_network_pdu_data, test_network_pdu_len);
460 #endif
461 
462 #ifdef ENABLE_MESH_ADV_BEARER
463         expect_adv_network_pdu(test_network_pdu_data, test_network_pdu_len);
464 #endif
465     }
466 }
467 
468 void test_send_control_message(uint16_t netkey_index, uint8_t ttl, uint16_t src, uint16_t dest, char * control_pdu, int count, char ** lower_transport_pdus, char ** network_pdus){
469 
470     transport_pdu_len = strlen(control_pdu) / 2;
471     btstack_parse_hex(control_pdu, transport_pdu_len, transport_pdu_data);
472 
473     uint8_t opcode = transport_pdu_data[0];
474 
475     mesh_pdu_t * pdu;
476     if (transport_pdu_len < 12){
477         // send as unsegmented control pdu
478         pdu = (mesh_pdu_t *) mesh_network_pdu_get();
479     } else {
480         // send as segmented control pdu
481         pdu = (mesh_pdu_t *) mesh_transport_pdu_get();
482     }
483     mesh_upper_transport_setup_control_pdu(pdu, netkey_index, ttl, src, dest, opcode, transport_pdu_data+1, transport_pdu_len-1);
484     mesh_upper_transport_send_control_pdu(pdu);
485 
486     // check for all network pdus
487     int i;
488     for (i=0;i<count;i++){
489         // expected network pdu
490         test_network_pdu_len = strlen(network_pdus[i]) / 2;
491         btstack_parse_hex(network_pdus[i], test_network_pdu_len, test_network_pdu_data);
492 
493 #ifdef ENABLE_MESH_GATT_BEARER
494         expect_gatt_network_pdu(test_network_pdu_data, test_network_pdu_len);
495 #endif
496 
497 #ifdef ENABLE_MESH_ADV_BEARER
498         expect_adv_network_pdu(test_network_pdu_data, test_network_pdu_len);
499 #endif
500 
501     }
502 }
503 #if 1
504 // Message 1
505 char * message1_network_pdus[] = {
506     (char *) "68eca487516765b5e5bfdacbaf6cb7fb6bff871f035444ce83a670df"
507 };
508 char * message1_lower_transport_pdus[] = {
509     (char *) "034b50057e400000010000",
510 };
511 char * message1_upper_transport_pdu = (char *) "034b50057e400000010000";
512 TEST(MessageTest, Message1Receive){
513     load_network_key_nid_68();
514     mesh_set_iv_index(0x12345678);
515     test_receive_network_pdus(1, message1_network_pdus, message1_lower_transport_pdus, message1_upper_transport_pdu);
516 }
517 TEST(MessageTest, Message1Send){
518     uint16_t netkey_index = 0;
519     uint8_t  ttl          = 0;
520     uint16_t src          = 0x1201;
521     uint16_t dest         = 0xfffd;
522     uint32_t seq          = 1;
523     load_network_key_nid_68();
524     mesh_set_iv_index(0x12345678);
525     mesh_sequence_number_set(seq);
526     test_send_control_message(netkey_index, ttl, src, dest, message1_upper_transport_pdu, 1, message1_lower_transport_pdus, message1_network_pdus);
527 }
528 
529 // Message 2
530 char * message2_network_pdus[] = {
531     (char *) "68d4c826296d7979d7dbc0c9b4d43eebec129d20a620d01e"
532 };
533 char * message2_lower_transport_pdus[] = {
534     (char *) "04320308ba072f",
535 };
536 char * message2_upper_transport_pdu = (char *) "04320308ba072f";
537 TEST(MessageTest, Message2Receive){
538     load_network_key_nid_68();
539     mesh_set_iv_index(0x12345678);
540     test_receive_network_pdus(1, message2_network_pdus, message2_lower_transport_pdus, message2_upper_transport_pdu);
541 }
542 TEST(MessageTest, Message2Send){
543     uint16_t netkey_index = 0;
544     uint8_t  ttl          = 0;
545     uint16_t src          = 0x2345;
546     uint16_t dest         = 0x1201;
547     uint32_t seq          = 0x014820;
548     load_network_key_nid_68();
549     mesh_set_iv_index(0x12345678);
550     mesh_sequence_number_set(seq);
551     test_send_control_message(netkey_index, ttl, src, dest, message2_upper_transport_pdu, 1, message2_lower_transport_pdus, message2_network_pdus);
552 }
553 
554 // Message 3
555 char * message3_network_pdus[] = {
556     (char *) "68da062bc96df253273086b8c5ee00bdd9cfcc62a2ddf572"
557 };
558 char * message3_lower_transport_pdus[] = {
559     (char *) "04fa0205a6000a",
560 };
561 char * message3_upper_transport_pdu = (char *) "04fa0205a6000a";
562 TEST(MessageTest, Message3Receive){
563     load_network_key_nid_68();
564     mesh_set_iv_index(0x12345678);
565     test_receive_network_pdus(1, message3_network_pdus, message3_lower_transport_pdus, message3_upper_transport_pdu);
566 }
567 TEST(MessageTest, Message3Send){
568     uint16_t netkey_index = 0;
569     uint8_t  ttl          = 0;
570     uint16_t src          = 0x2fe3;
571     uint16_t dest         = 0x1201;
572     uint32_t seq          = 0x2b3832;
573     load_network_key_nid_68();
574     mesh_set_iv_index(0x12345678);
575     mesh_sequence_number_set(seq);
576     test_send_control_message(netkey_index, ttl, src, dest, message3_upper_transport_pdu, 1, message3_lower_transport_pdus, message3_network_pdus);
577 }
578 
579 // Message 4
580 char * message4_network_pdus[] = {
581     (char *) "5e84eba092380fb0e5d0ad970d579a4e88051c"
582 };
583 char * message4_lower_transport_pdus[] = {
584     (char *) "0100",
585 };
586 char * message4_upper_transport_pdu = (char *) "0100";
587 TEST(MessageTest, Message4Receive){
588     load_network_key_nid_5e();
589     mesh_set_iv_index(0x12345678);
590     test_receive_network_pdus(1, message4_network_pdus, message4_lower_transport_pdus, message4_upper_transport_pdu);
591 }
592 TEST(MessageTest, Message4Send){
593     uint16_t netkey_index = 0;
594     uint8_t  ttl          = 0;
595     uint16_t src          = 0x1201;
596     uint16_t dest         = 0x2345;
597     uint32_t seq          = 0x000002;
598     load_network_key_nid_5e();
599     mesh_set_iv_index(0x12345678);
600     mesh_sequence_number_set(seq);
601     test_send_control_message(netkey_index, ttl, src, dest, message4_upper_transport_pdu, 1, message4_lower_transport_pdus, message4_network_pdus);
602 }
603 
604 // Message 5
605 char * message5_network_pdus[] = {
606     (char *) "5eafd6f53c43db5c39da1792b1fee9ec74b786c56d3a9dee",
607 };
608 char * message5_lower_transport_pdus[] = {
609     (char *) "02001234567800",
610 };
611 char * message5_upper_transport_pdu = (char *) "02001234567800";
612 TEST(MessageTest, Message5Receive){
613     load_network_key_nid_5e();
614     mesh_set_iv_index(0x12345678);
615     test_receive_network_pdus(1, message5_network_pdus, message5_lower_transport_pdus, message5_upper_transport_pdu);
616 }
617 TEST(MessageTest, Message5Send){
618     uint16_t netkey_index = 0;
619     uint8_t  ttl          = 0;
620     uint16_t src          = 0x2345;
621     uint16_t dest         = 0x1201;
622     uint32_t seq          = 0x014834;
623     load_network_key_nid_5e();
624     mesh_set_iv_index(0x12345678);
625     mesh_sequence_number_set(seq);
626     test_send_control_message(netkey_index, ttl, src, dest, message5_upper_transport_pdu, 1, message5_lower_transport_pdus, message5_network_pdus);
627 }
628 
629 // Message 6
630 char * message6_network_pdus[] = {
631     (char *) "68cab5c5348a230afba8c63d4e686364979deaf4fd40961145939cda0e",
632     (char *) "681615b5dd4a846cae0c032bf0746f44f1b8cc8ce5edc57e55beed49c0",
633 };
634 char * message6_lower_transport_pdus[] = {
635     (char *) "8026ac01ee9dddfd2169326d23f3afdf",
636     (char *) "8026ac21cfdc18c52fdef772e0e17308",
637 };
638 char * message6_upper_transport_pdu = (char *) "0056341263964771734fbd76e3b40519d1d94a48";
639 TEST(MessageTest, Message6Receive){
640     load_network_key_nid_68();
641     mesh_set_iv_index(0x12345678);
642     test_receive_network_pdus(2, message6_network_pdus, message6_lower_transport_pdus, message6_upper_transport_pdu);
643 }
644 TEST(MessageTest, Message6Send){
645     uint16_t netkey_index = 0;
646     uint16_t appkey_index = MESH_DEVICE_KEY_INDEX;
647     uint8_t  ttl          = 4;
648     uint16_t src          = 0x0003;
649     uint16_t dest         = 0x1201;
650     uint32_t seq          = 0x3129ab;
651     uint8_t  szmic        = 0;
652 
653     load_network_key_nid_68();
654     mesh_set_iv_index(0x12345678);
655     mesh_sequence_number_set(seq);
656     test_send_access_message(netkey_index, appkey_index, ttl, src, dest, szmic, message6_upper_transport_pdu, 2, message6_lower_transport_pdus, message6_network_pdus);
657 }
658 
659 // Message 7 - ACK
660 char * message7_network_pdus[] = {
661     (char *) "68e476b5579c980d0d730f94d7f3509df987bb417eb7c05f",
662 };
663 char * message7_lower_transport_pdus[] = {
664     (char *) "00a6ac00000002",
665 };
666 char * message7_upper_transport_pdu = (char *) "00a6ac00000002";
667 TEST(MessageTest, Message7Send){
668     uint16_t netkey_index = 0;
669     uint8_t  ttl          = 0x0b;
670     uint16_t src          = 0x2345;
671     uint16_t dest         = 0x0003;
672     uint32_t seq          = 0x014835;
673 
674     load_network_key_nid_68();
675     mesh_set_iv_index(0x12345678);
676     mesh_sequence_number_set(seq);
677     test_send_control_message(netkey_index, ttl, src, dest, message7_upper_transport_pdu, 1, message7_lower_transport_pdus, message7_network_pdus);
678 }
679 // ACK message, handled in mesh_transport - can be checked with test_control_receive_network_pdu
680 // TEST(MessageTest, Message7Receive){
681 //     mesh_set_iv_index(0x12345678);
682 //     test_receive_network_pdus(1, message7_network_pdus, message7_lower_transport_pdus, message7_upper_transport_pdu);
683 // }
684 
685 // Message 8 - ACK
686 char * message8_network_pdus[] = {
687     (char *) "684daa6267c2cf0e2f91add6f06e66006844cec97f973105ae2534f958",
688 };
689 char * message8_lower_transport_pdus[] = {
690     (char *) "8026ac01ee9dddfd2169326d23f3afdf",
691 };
692 char * message8_upper_transport_pdu = (char *) "8026ac01ee9dddfd2169326d23f3afdf";
693 // ACK message, handled in mesh_transport - can be checked with test_control_receive_network_pdu
694 // TEST(MessageTest, Message8Receive){
695 //     mesh_set_iv_index(0x12345678);
696 //     test_receive_network_pdus(1, message8_network_pdus, message8_lower_transport_pdus, message8_upper_transport_pdu);
697 // }
698 
699 // Message 9 - ACK
700 
701 // Message 10
702 char * message10_network_pdus[] = {
703     (char *) "5e7b786568759f7777ed355afaf66d899c1e3d",
704 };
705 char * message10_lower_transport_pdus[] = {
706     (char *) "0101",
707 };
708 char * message10_upper_transport_pdu = (char *) "0101";
709 TEST(MessageTest, Message10Receive){
710     load_network_key_nid_5e();
711     mesh_set_iv_index(0x12345678);
712     test_receive_network_pdus(1, message10_network_pdus, message10_lower_transport_pdus, message10_upper_transport_pdu);
713 }
714 TEST(MessageTest, Message10Send){
715     uint16_t netkey_index = 0;
716     uint8_t  ttl          = 0;
717     uint16_t src          = 0x1201;
718     uint16_t dest         = 0x2345;
719     uint32_t seq          = 0x000003;
720 
721     load_network_key_nid_5e();
722     mesh_set_iv_index(0x12345678);
723     mesh_sequence_number_set(seq);
724     test_send_control_message(netkey_index, ttl, src, dest, message10_upper_transport_pdu, 1, message10_lower_transport_pdus, message10_network_pdus);
725 }
726 
727 // Message 11
728 // The Friend node responds to this poll with the first segment of the stored message. It also indicates that it has more data.
729 
730 // Message 12
731 char * message12_network_pdus[] = {
732     (char *) "5e8a18fc6e4d05ae21466087599c2426ce9a35",
733 };
734 char * message12_lower_transport_pdus[] = {
735     (char *) "0101",
736 };
737 char * message12_upper_transport_pdu = (char *) "0101";
738 TEST(MessageTest, Message12Receive){
739     load_network_key_nid_5e();
740     mesh_set_iv_index(0x12345678);
741     test_receive_network_pdus(1, message12_network_pdus, message12_lower_transport_pdus, message12_upper_transport_pdu);
742 }
743 TEST(MessageTest, Message12Send){
744     uint16_t netkey_index = 0;
745     uint8_t  ttl          = 0;
746     uint16_t src          = 0x1201;
747     uint16_t dest         = 0x2345;
748     uint32_t seq          = 0x000004;
749 
750     load_network_key_nid_5e();
751     mesh_set_iv_index(0x12345678);
752     mesh_sequence_number_set(seq);
753     test_send_control_message(netkey_index, ttl, src, dest, message12_upper_transport_pdu, 1, message12_lower_transport_pdus, message12_network_pdus);
754 }
755 
756 // Message 13
757 // The Friend node responds with the same message as last time.
758 // Message 14
759 // The Low Power node received the retransmitted stored message. As that message has the MD bit set
760 // it sends another Friend Poll to obtain the next message.
761 char * message14_network_pdus[] = {
762     (char *) "5e0bbaf92b5c8f7d3ae62a3c75dff683dce24e",
763 };
764 char * message14_lower_transport_pdus[] = {
765     (char *) "0100",
766 };
767 char * message14_upper_transport_pdu = (char *) "0100";
768 TEST(MessageTest, Message14Receive){
769     load_network_key_nid_5e();
770     mesh_set_iv_index(0x12345678);
771     test_receive_network_pdus(1, message14_network_pdus, message14_lower_transport_pdus, message14_upper_transport_pdu);
772 }
773 TEST(MessageTest, Message14Send){
774     uint16_t netkey_index = 0;
775     uint8_t  ttl          = 0;
776     uint16_t src          = 0x1201;
777     uint16_t dest         = 0x2345;
778     uint32_t seq          = 0x000005;
779 
780     load_network_key_nid_5e();
781     mesh_set_iv_index(0x12345678);
782     mesh_sequence_number_set(seq);
783     test_send_control_message(netkey_index, ttl, src, dest, message14_upper_transport_pdu, 1, message14_lower_transport_pdus, message14_network_pdus);
784 }
785 
786 // Message 15
787 // The Friend node responds, with the next message in the friend queue. The Friend node has no more data, so it sets the MD to 0.
788 char * message15_network_pdus[] = {
789     (char *) "5ea8dab50e7ee7f1d29805664d235eacd707217dedfe78497fefec7391",
790 };
791 char * message15_lower_transport_pdus[] = {
792     (char *) "8026ac21cfdc18c52fdef772e0e17308",
793 };
794 char * message15_upper_transport_pdu = (char *) "0100";
795 // ACK message, handled in mesh_transport - can be checked with test_control_receive_network_pdu
796 // not sure - no upper access message
797 // TEST(MessageTest, Message15Receive){
798 //     load_network_key_nid_5e();
799 //     mesh_set_iv_index(0x12345678);
800 //     test_receive_network_pdus(1, message15_network_pdus, message15_lower_transport_pdus, message15_upper_transport_pdu);
801 // }
802 
803 // Message 16
804 char * message16_network_pdus[] = {
805     (char *) "68e80e5da5af0e6b9be7f5a642f2f98680e61c3a8b47f228",
806 };
807 char * message16_lower_transport_pdus[] = {
808     (char *) "0089511bf1d1a81c11dcef",
809 };
810 char * message16_upper_transport_pdu = (char *) "800300563412";
811 TEST(MessageTest, Message16Receive){
812     load_network_key_nid_68();
813     mesh_set_iv_index(0x12345678);
814     test_receive_network_pdus(1, message16_network_pdus, message16_lower_transport_pdus, message16_upper_transport_pdu);
815 }
816 TEST(MessageTest, Message16Send){
817     uint16_t netkey_index = 0;
818     uint16_t appkey_index = MESH_DEVICE_KEY_INDEX;
819     uint8_t  ttl          = 0x0b;
820     uint16_t src          = 0x1201;
821     uint16_t dest         = 0x0003;
822     uint32_t seq          = 0x000006;
823     uint8_t  szmic        = 0;
824 
825     load_network_key_nid_68();
826     mesh_set_iv_index(0x12345678);
827     mesh_sequence_number_set(seq);
828     test_send_access_message(netkey_index, appkey_index, ttl, src, dest, szmic, message16_upper_transport_pdu, 1, message16_lower_transport_pdus, message16_network_pdus);
829 }
830 
831 // Message 17
832 // A Relay node receives the message from the Low Power node and relays it, decrementing the TTL value.
833 // Message 18
834 char * message18_network_pdus[] = {
835     (char *) "6848cba437860e5673728a627fb938535508e21a6baf57",
836 };
837 char * message18_lower_transport_pdus[] = {
838     (char *) "665a8bde6d9106ea078a",
839 };
840 char * message18_upper_transport_pdu = (char *) "0400000000";
841 TEST(MessageTest, Message18Receive){
842     load_network_key_nid_68();
843     mesh_set_iv_index(0x12345678);
844     test_receive_network_pdus(1, message18_network_pdus, message18_lower_transport_pdus, message18_upper_transport_pdu);
845 }
846 TEST(MessageTest, Message18Send){
847     uint16_t netkey_index = 0;
848     uint16_t appkey_index = 0;
849     uint8_t  ttl          = 3;
850     uint16_t src          = 0x1201;
851     uint16_t dest         = 0xffff;
852     uint32_t seq          = 0x00007;
853     uint8_t  szmic        = 0;
854 
855     load_network_key_nid_68();
856     mesh_set_iv_index(0x12345678);
857     mesh_sequence_number_set(seq);
858     test_send_access_message(netkey_index, appkey_index, ttl, src, dest, szmic, message18_upper_transport_pdu, 1, message18_lower_transport_pdus, message18_network_pdus);
859 }
860 
861 
862 // Message 19
863 // The Low Power node sends another Health Current Status message indicating that there are three faults:
864 // Battery Low Warning, Power Supply Interrupted Warning, and Supply Voltage Too Low Warning.
865 char * message19_network_pdus[] = {
866     (char *) "68110edeecd83c3010a05e1b23a926023da75d25ba91793736",
867 };
868 char * message19_lower_transport_pdus[] = {
869     (char *) "66ca6cd88e698d1265f43fc5",
870 };
871 char * message19_upper_transport_pdu = (char *) "04000000010703";
872 TEST(MessageTest, Message19Receive){
873     load_network_key_nid_68();
874     mesh_set_iv_index(0x12345678);
875     test_receive_network_pdus(1, message19_network_pdus, message19_lower_transport_pdus, message19_upper_transport_pdu);
876 }
877 TEST(MessageTest, Message19Send){
878     uint16_t netkey_index = 0;
879     uint16_t appkey_index = 0;
880     uint8_t  ttl          = 3;
881     uint16_t src          = 0x1201;
882     uint16_t dest         = 0xffff;
883     uint32_t seq          = 0x00009;
884     uint8_t  szmic        = 0;
885 
886     load_network_key_nid_68();
887     mesh_set_iv_index(0x12345678);
888     mesh_sequence_number_set(seq);
889     test_send_access_message(netkey_index, appkey_index, ttl, src, dest, szmic, message19_upper_transport_pdu, 1, message19_lower_transport_pdus, message19_network_pdus);
890 }
891 
892 // Message 20
893 char * message20_network_pdus[] = {
894     (char *) "e85cca51e2e8998c3dc87344a16c787f6b08cc897c941a5368",
895 };
896 char * message20_lower_transport_pdus[] = {
897     (char *) "669c9803e110fea929e9542d",
898 };
899 char * message20_upper_transport_pdu = (char *) "04000000010703";
900 TEST(MessageTest, Message20Receive){
901     load_network_key_nid_68();
902     mesh_set_iv_index(0x12345677);
903     test_receive_network_pdus(1, message20_network_pdus, message20_lower_transport_pdus, message20_upper_transport_pdu);
904 }
905 TEST(MessageTest, Message20Send){
906     uint16_t netkey_index = 0;
907     uint16_t appkey_index = 0;
908     uint8_t  ttl          = 3;
909     uint16_t src          = 0x1234;
910     uint16_t dest         = 0xffff;
911     uint32_t seq          = 0x070809;
912     uint8_t  szmic        = 0;
913 
914     load_network_key_nid_68();
915     mesh_set_iv_index(0x12345677);
916     mesh_sequence_number_set(seq);
917     test_send_access_message(netkey_index, appkey_index, ttl, src, dest, szmic, message20_upper_transport_pdu, 1, message20_lower_transport_pdus, message20_network_pdus);
918 }
919 
920 // Message 21
921 // The Low Power node sends a vendor command to a group address.
922 char * message21_network_pdus[] = {
923     (char *) "e84e8fbe003f58a4d61157bb76352ea6307eebfe0f30b83500e9",
924 };
925 char * message21_lower_transport_pdus[] = {
926     (char *) "664d92e9dfcf3ab85b6e8fcf03",
927 };
928 char * message21_upper_transport_pdu = (char *) "d50a0048656c6c6f";
929 TEST(MessageTest, Message21Receive){
930     load_network_key_nid_68();
931     mesh_set_iv_index(0x12345677);
932     test_receive_network_pdus(1, message21_network_pdus, message21_lower_transport_pdus, message21_upper_transport_pdu);
933 }
934 TEST(MessageTest, Message21Send){
935     uint16_t netkey_index = 0;
936     uint16_t appkey_index = 0;
937     uint8_t  ttl          = 3;
938     uint16_t src          = 0x1234;
939     uint16_t dest         = 0xc105;
940     uint32_t seq          = 0x07080a;
941     uint8_t  szmic        = 0;
942 
943     load_network_key_nid_68();
944     mesh_set_iv_index(0x12345677);
945     mesh_sequence_number_set(seq);
946     test_send_access_message(netkey_index, appkey_index, ttl, src, dest, szmic, message21_upper_transport_pdu, 1, message21_lower_transport_pdus, message21_network_pdus);
947 }
948 
949 // Message 22
950 char * message22_network_pdus[] = {
951     (char *) "e8d85caecef1e3ed31f3fdcf88a411135fea55df730b6b28e255",
952 };
953 char * message22_lower_transport_pdus[] = {
954     (char *) "663871b904d431526316ca48a0",
955 };
956 char * message22_upper_transport_pdu = (char *) "d50a0048656c6c6f";
957 char * message22_label_string = (char *) "0073e7e4d8b9440faf8415df4c56c0e1";
958 
959 TEST(MessageTest, Message22Receive){
960     load_network_key_nid_68();
961     mesh_set_iv_index(0x12345677);
962     uint8_t label_uuid[16];
963     btstack_parse_hex(message22_label_string, 16, label_uuid);
964     mesh_virtual_address_register(label_uuid, 0xb529);
965     test_receive_network_pdus(1, message22_network_pdus, message22_lower_transport_pdus, message22_upper_transport_pdu);
966 }
967 
968 TEST(MessageTest, Message22Send){
969     uint16_t netkey_index = 0;
970     uint16_t appkey_index = 0;
971     uint8_t  ttl          = 3;
972     uint16_t src          = 0x1234;
973     uint32_t seq          = 0x07080b;
974     uint8_t  szmic        = 0;
975 
976     load_network_key_nid_68();
977     mesh_set_iv_index(0x12345677);
978     mesh_sequence_number_set(seq);
979     uint8_t label_uuid[16];
980     btstack_parse_hex(message22_label_string, 16, label_uuid);
981     mesh_virtual_address_t * virtual_address = mesh_virtual_address_register(label_uuid, 0xb529);
982     uint16_t pseudo_dst = virtual_address->pseudo_dst;
983     test_send_access_message(netkey_index, appkey_index, ttl, src, pseudo_dst, szmic, message22_upper_transport_pdu, 1, message22_lower_transport_pdus, message22_network_pdus);
984 }
985 
986 // Message 23
987 char * message23_network_pdus[] = {
988     (char *) "e877a48dd5fe2d7a9d696d3dd16a75489696f0b70c711b881385",
989 };
990 char * message23_lower_transport_pdus[] = {
991     (char *) "662456db5e3100eef65daa7a38",
992 };
993 char * message23_upper_transport_pdu = (char *) "d50a0048656c6c6f";
994 char * message23_label_string = (char *) "f4a002c7fb1e4ca0a469a021de0db875";
995 
996 TEST(MessageTest, Message23Receive){
997     load_network_key_nid_68();
998     mesh_set_iv_index(0x12345677);
999     uint8_t label_uuid[16];
1000     btstack_parse_hex(message23_label_string, 16, label_uuid);
1001     mesh_virtual_address_register(label_uuid, 0x9736);
1002     test_receive_network_pdus(1, message23_network_pdus, message23_lower_transport_pdus, message23_upper_transport_pdu);
1003 }
1004 TEST(MessageTest, Message23Send){
1005     uint16_t netkey_index = 0;
1006     uint16_t appkey_index = 0;
1007     uint8_t  ttl          = 3;
1008     uint16_t src          = 0x1234;
1009     uint32_t seq          = 0x07080c;
1010     uint8_t  szmic        = 0;
1011 
1012     load_network_key_nid_68();
1013     mesh_set_iv_index(0x12345677);
1014     mesh_sequence_number_set(seq);
1015     uint8_t label_uuid[16];
1016     btstack_parse_hex(message23_label_string, 16, label_uuid);
1017     mesh_virtual_address_t * virtual_address = mesh_virtual_address_register(label_uuid, 0x9736);
1018     uint16_t pseudo_dst = virtual_address->pseudo_dst;
1019     test_send_access_message(netkey_index, appkey_index, ttl, src, pseudo_dst, szmic, message23_upper_transport_pdu, 1, message23_lower_transport_pdus, message23_network_pdus);
1020 }
1021 #endif
1022 
1023 // Message 24
1024 char * message24_network_pdus[] = {
1025     (char *) "e8624e65bb8c1794e998b4081f47a35251fdd3896d99e4db489b918599",
1026     (char *) "e8a7d0f0a2ea42dc2f4dd6fb4db33a6c088d023b47",
1027 };
1028 char * message24_lower_transport_pdus[] = {
1029     (char *) "e6a03401c3c51d8e476b28e3aa5001f3",
1030     (char *) "e6a034211c01cea6",
1031 };
1032 char * message24_upper_transport_pdu = (char *) "ea0a00576f726c64";
1033 char * message24_label_string = (char *) "f4a002c7fb1e4ca0a469a021de0db875";
1034 TEST(MessageTest, Message24Receive){
1035     load_network_key_nid_68();
1036     mesh_set_iv_index(0x12345677);
1037     uint8_t label_uuid[16];
1038     btstack_parse_hex(message24_label_string, 16, label_uuid);
1039     mesh_virtual_address_register(label_uuid, 0x9736);
1040     test_receive_network_pdus(2, message24_network_pdus, message24_lower_transport_pdus, message24_upper_transport_pdu);
1041 }
1042 TEST(MessageTest, Message24Send){
1043     uint16_t netkey_index = 0;
1044     uint16_t appkey_index = 0;
1045     uint8_t  ttl          = 3;
1046     uint16_t src          = 0x1234;
1047     uint32_t seq          = 0x07080d;
1048     uint8_t  szmic        = 1;
1049 
1050     load_network_key_nid_68();
1051     mesh_set_iv_index(0x12345677);
1052     mesh_sequence_number_set(seq);
1053     uint8_t label_uuid[16];
1054     btstack_parse_hex(message24_label_string, 16, label_uuid);
1055     mesh_virtual_address_t * virtual_address = mesh_virtual_address_register(label_uuid, 0x9736);
1056     uint16_t pseudo_dst = virtual_address->pseudo_dst;
1057     test_send_access_message(netkey_index, appkey_index, ttl, src, pseudo_dst, szmic, message24_upper_transport_pdu, 2, message24_lower_transport_pdus, message24_network_pdus);
1058 }
1059 
1060 // Proxy Configuration Test
1061 char * proxy_config_pdus[] = {
1062     (char *) "0210386bd60efbbb8b8c28512e792d3711f4b526",
1063 };
1064 char * proxy_config_lower_transport_pdus[] = {
1065     (char *) "0000",
1066 };
1067 char * proxy_config_upper_transport_pdu = (char *) "ea0a00576f726c64";
1068 TEST(MessageTest, ProxyConfigReceive){
1069     mesh_set_iv_index(0x12345678);
1070     load_network_key_nid_10();
1071     int i = 0;
1072     char ** network_pdus = proxy_config_pdus;
1073     test_network_pdu_len = strlen(network_pdus[i]) / 2;
1074     btstack_parse_hex(network_pdus[i], test_network_pdu_len, test_network_pdu_data);
1075     mesh_network_process_proxy_configuration_message(&test_network_pdu_data[1], test_network_pdu_len-1);
1076     while (received_proxy_pdu == NULL) {
1077         mock_process_hci_cmd();
1078     }
1079     char ** lower_transport_pdus = proxy_config_lower_transport_pdus;
1080     transport_pdu_len = strlen(lower_transport_pdus[i]) / 2;
1081     btstack_parse_hex(lower_transport_pdus[i], transport_pdu_len, transport_pdu_data);
1082 
1083     uint8_t * lower_transport_pdu     = mesh_network_pdu_data(received_proxy_pdu);
1084     uint8_t   lower_transport_pdu_len = mesh_network_pdu_len(received_proxy_pdu);
1085 
1086     // printf_hexdump(lower_transport_pdu, lower_transport_pdu_len);
1087 
1088     CHECK_EQUAL( transport_pdu_len, lower_transport_pdu_len);
1089     CHECK_EQUAL_ARRAY(transport_pdu_data, lower_transport_pdu, transport_pdu_len);
1090 
1091     // done
1092     mesh_network_message_processed_by_higher_layer(received_proxy_pdu);
1093     received_proxy_pdu = NULL;
1094 }
1095 
1096 
1097 TEST(MessageTest, ProxyConfigSend){
1098     uint16_t netkey_index = 0;
1099     uint8_t  ctl          = 1;
1100     uint8_t  ttl          = 0;
1101     uint16_t src          = 1;
1102     uint16_t dest         = 0;
1103     uint32_t seq          = 1;
1104     uint8_t  nid          = 0x10;
1105     mesh_set_iv_index(0x12345678);
1106     load_network_key_nid_10();
1107     mesh_network_pdu_t * network_pdu = mesh_network_pdu_get();
1108     uint8_t data[] = { 0 , 0 };
1109     mesh_network_setup_pdu(network_pdu, netkey_index, nid, ctl, ttl, seq, src, dest, data, sizeof(data));
1110     mesh_network_encrypt_proxy_configuration_message(network_pdu);
1111     while (received_proxy_pdu == NULL) {
1112         mock_process_hci_cmd();
1113     }
1114     uint8_t * proxy_pdu_data  = received_proxy_pdu->data;
1115     uint8_t   proxy_pdu_len   = received_proxy_pdu->len;
1116 
1117     int i = 0;
1118     char ** network_pdus = proxy_config_pdus;
1119     transport_pdu_len = strlen(network_pdus[i]) / 2;
1120     btstack_parse_hex(network_pdus[i], transport_pdu_len, transport_pdu_data);
1121 
1122     CHECK_EQUAL( transport_pdu_len-1, proxy_pdu_len);
1123     CHECK_EQUAL_ARRAY(transport_pdu_data+1, proxy_pdu_data, transport_pdu_len-1);
1124 
1125     received_proxy_pdu = NULL;
1126 
1127     mesh_network_pdu_free(network_pdu);
1128 }
1129 
1130 static btstack_crypto_aes128_t crypto_request_aes128;
1131 static uint8_t plaintext[16];
1132 static uint8_t identity_key[16];
1133 static uint8_t hash[16];
1134 static uint8_t random_value[8];
1135 
1136 static void mesh_proxy_handle_get_aes128(void * arg){
1137     UNUSED(arg);
1138     uint8_t expected_hash[8];
1139     uint8_t expected_random_value[8];
1140 
1141     btstack_parse_hex("00861765aefcc57b", 8, expected_hash);
1142     CHECK_EQUAL_ARRAY(&hash[8], expected_hash, 8);
1143 
1144     btstack_parse_hex("34ae608fbbc1f2c6", 8, expected_random_value);
1145     CHECK_EQUAL_ARRAY(random_value, expected_random_value, 8);
1146 }
1147 
1148 TEST(MessageTest, ServiceDataUsingNodeIdentityTest){
1149     btstack_parse_hex("34ae608fbbc1f2c6", 8, random_value);
1150     memset(plaintext, 0, sizeof(plaintext));
1151     memcpy(&plaintext[6] , random_value, 8);
1152     big_endian_store_16(plaintext, 14, 0x1201);
1153     // 84396c435ac48560b5965385253e210c
1154     btstack_parse_hex("84396c435ac48560b5965385253e210c", 16, identity_key);
1155     btstack_crypto_aes128_encrypt(&crypto_request_aes128, identity_key, plaintext, hash, mesh_proxy_handle_get_aes128, NULL);
1156 }
1157 
1158 // Mesh v1.0, 8.2.1
1159 static btstack_crypto_aes128_cmac_t aes_cmac_request;
1160 static uint8_t k4_result[1];
1161 static void handle_k4_result(void *arg){
1162     printf("ApplicationkeyIDTest: %02x\n", k4_result[0]);
1163     CHECK_EQUAL( 0x26, k4_result[0]);
1164 }
1165 TEST(MessageTest, ApplicationkeyIDTest){
1166     static uint8_t application_key[16];
1167     btstack_parse_hex("63964771734fbd76e3b40519d1d94a48", 16, application_key);
1168     mesh_k4(&aes_cmac_request, application_key, &k4_result[0], &handle_k4_result, NULL);
1169 }
1170 
1171 int main (int argc, const char * argv[]){
1172     return CommandLineTestRunner::RunAllTests(argc, argv);
1173 }
1174