xref: /btstack/test/mesh/mesh_message_test.cpp (revision aaa248aa80ca08f5f368d2a6fde8ccb05ae25934)
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         default:
253             break;
254     }
255 }
256 
257 static void test_upper_transport_access_message_handler(mesh_pdu_t * pdu){
258     mesh_transport_pdu_t * transport_pdu;
259     mesh_network_pdu_t   * network_pdu;
260     mesh_message_pdu_t   * message_pdu;
261     switch(pdu->pdu_type){
262         case MESH_PDU_TYPE_TRANSPORT:
263             transport_pdu = (mesh_transport_pdu_t *) pdu;
264             printf("test MESH_ACCESS_TRANSPORT_PDU_RECEIVED\n");
265             recv_upper_transport_pdu_len = transport_pdu->len;
266             memcpy(recv_upper_transport_pdu_data, transport_pdu->data, recv_upper_transport_pdu_len);
267             mesh_upper_transport_message_processed_by_higher_layer(pdu);
268             break;
269         case MESH_PDU_TYPE_NETWORK:
270             btstack_assert(0);
271             break;
272         case MESH_PDU_TYPE_MESSAGE:
273             message_pdu = (mesh_message_pdu_t *) pdu;
274             printf("test MESH_PDU_TYPE_MESSAGE\n");
275             network_pdu = (mesh_network_pdu_t *) btstack_linked_list_get_first_item(&message_pdu->segments);
276             recv_upper_transport_pdu_len = mesh_network_pdu_len(network_pdu)  - 1;
277             memcpy(recv_upper_transport_pdu_data, mesh_network_pdu_data(network_pdu) + 1, recv_upper_transport_pdu_len);
278             mesh_upper_transport_message_processed_by_higher_layer(pdu);
279             break;
280         default:
281             break;
282     }
283 }
284 
285 static void test_upper_transport_control_message_handler(mesh_pdu_t * pdu){
286     mesh_transport_pdu_t * transport_pdu;
287     mesh_network_pdu_t   * network_pdu;
288     switch(pdu->pdu_type){
289         case MESH_PDU_TYPE_TRANSPORT:
290             transport_pdu = (mesh_transport_pdu_t *) pdu;
291             printf("test MESH_CONTROL_TRANSPORT_PDU_RECEIVED\n");
292             recv_upper_transport_pdu_len = transport_pdu->len;
293             memcpy(recv_upper_transport_pdu_data, transport_pdu->data, recv_upper_transport_pdu_len);
294             mesh_upper_transport_message_processed_by_higher_layer(pdu);
295             break;
296         case MESH_PDU_TYPE_NETWORK:
297             network_pdu = (mesh_network_pdu_t *) pdu;
298             printf("test MESH_CONTROL_NETWORK_PDU_RECEIVED\n");
299             recv_upper_transport_pdu_len = mesh_network_pdu_len(network_pdu);
300             memcpy(recv_upper_transport_pdu_data, mesh_network_pdu_data(network_pdu), recv_upper_transport_pdu_len);
301             mesh_upper_transport_message_processed_by_higher_layer(pdu);
302             break;
303         default:
304             break;
305     }
306 }
307 
308 TEST_GROUP(MessageTest){
309     void setup(void){
310         btstack_memory_init();
311         btstack_crypto_init();
312         load_provisioning_data_test_message();
313         mesh_network_init();
314         mesh_lower_transport_init();
315         mesh_upper_transport_init();
316         mesh_network_key_init();
317         // intercept messages between network and lower layer
318         mesh_network_set_higher_layer_handler(&test_lower_transport_callback_handler);
319         mesh_network_set_proxy_message_handler(&test_proxy_server_callback_handler);
320         // register to receive upper transport messages
321         mesh_upper_transport_register_access_message_handler(&test_upper_transport_access_message_handler);
322         mesh_upper_transport_register_control_message_handler(&test_upper_transport_control_message_handler);
323         mesh_seq_auth_reset();
324 #ifdef ENABLE_MESH_GATT_BEARER
325         mesh_foundation_gatt_proxy_set(1);
326         gatt_bearer_emit_connected();
327 #endif
328         outgoing_gatt_network_pdu_len = 0;
329         outgoing_adv_network_pdu_len = 0;
330         received_network_pdu = NULL;
331         recv_upper_transport_pdu_len =0;
332     }
333     void teardown(void){
334         // printf("-- teardown start --\n\n");
335         btstack_crypto_reset();
336         mesh_network_reset();
337         mesh_lower_transport_reset();
338         mesh_upper_transport_dump();
339         mesh_upper_transport_reset();
340         // mesh_network_dump();
341         // mesh_transport_dump();
342         printf("-- teardown complete --\n\n");
343     }
344 };
345 
346 static uint8_t transport_pdu_data[64];
347 static uint16_t transport_pdu_len;
348 
349 static     uint8_t test_network_pdu_len;
350 static uint8_t test_network_pdu_data[29];
351 
352 void test_receive_network_pdus(int count, char ** network_pdus, char ** lower_transport_pdus, char * access_pdu){
353     int i;
354     for (i=0;i<count;i++){
355         test_network_pdu_len = strlen(network_pdus[i]) / 2;
356         btstack_parse_hex(network_pdus[i], test_network_pdu_len, test_network_pdu_data);
357 
358         mesh_network_received_message(test_network_pdu_data, test_network_pdu_len, 0);
359 
360         while (received_network_pdu == NULL) {
361             mock_process_hci_cmd();
362         }
363 
364         transport_pdu_len = strlen(lower_transport_pdus[i]) / 2;
365         btstack_parse_hex(lower_transport_pdus[i], transport_pdu_len, transport_pdu_data);
366 
367         uint8_t * lower_transport_pdu     = mesh_network_pdu_data(received_network_pdu);
368         uint8_t   lower_transport_pdu_len = mesh_network_pdu_len(received_network_pdu);
369 
370         // printf_hexdump(lower_transport_pdu, lower_transport_pdu_len);
371 
372         CHECK_EQUAL( transport_pdu_len, lower_transport_pdu_len);
373         CHECK_EQUAL_ARRAY(transport_pdu_data, lower_transport_pdu, transport_pdu_len);
374 
375         // forward to mesh_transport
376         mesh_lower_transport_received_message(MESH_NETWORK_PDU_RECEIVED, received_network_pdu);
377 
378         // done
379         received_network_pdu = NULL;
380     }
381 
382     // wait for tranport pdu
383     while (recv_upper_transport_pdu_len == 0) {
384         mock_process_hci_cmd();
385     }
386 
387     transport_pdu_len = strlen(access_pdu) / 2;
388     btstack_parse_hex(access_pdu, transport_pdu_len, transport_pdu_data);
389 
390     printf("UpperTransportPDU: ");
391     printf_hexdump(recv_upper_transport_pdu_data, recv_upper_transport_pdu_len);
392     CHECK_EQUAL( transport_pdu_len, recv_upper_transport_pdu_len);
393     CHECK_EQUAL_ARRAY(transport_pdu_data, recv_upper_transport_pdu_data, transport_pdu_len);
394 }
395 
396 static void expect_gatt_network_pdu(const uint8_t * data, uint16_t len){
397         while (outgoing_gatt_network_pdu_len == 0) {
398             mock_process_hci_cmd();
399         }
400 
401         if (outgoing_gatt_network_pdu_len != test_network_pdu_len){
402             printf("Test Network PDU (%u): ", outgoing_gatt_network_pdu_len); printf_hexdump(outgoing_gatt_network_pdu_data, outgoing_gatt_network_pdu_len);
403             printf("Expected     PDU (%u): ", test_network_pdu_len); printf_hexdump(test_network_pdu_data, test_network_pdu_len);
404         }
405         CHECK_EQUAL( outgoing_gatt_network_pdu_len, test_network_pdu_len);
406         CHECK_EQUAL_ARRAY(test_network_pdu_data, outgoing_gatt_network_pdu_data, test_network_pdu_len);
407 
408         outgoing_gatt_network_pdu_len = 0;
409         gatt_bearer_emit_sent();
410 }
411 
412 static void expect_adv_network_pdu(const uint8_t * data, uint16_t len){
413         while (outgoing_adv_network_pdu_len == 0) {
414             mock_process_hci_cmd();
415         }
416 
417         if (outgoing_adv_network_pdu_len != test_network_pdu_len){
418             printf("Test Network PDU (%u): ", outgoing_adv_network_pdu_len); printf_hexdump(outgoing_adv_network_pdu_data, outgoing_adv_network_pdu_len);
419             printf("Expected     PDU (%u): ", test_network_pdu_len); printf_hexdump(test_network_pdu_data, test_network_pdu_len);
420         }
421         CHECK_EQUAL( outgoing_adv_network_pdu_len, test_network_pdu_len);
422         CHECK_EQUAL_ARRAY(test_network_pdu_data, outgoing_adv_network_pdu_data, test_network_pdu_len);
423 
424         outgoing_adv_network_pdu_len = 0;
425         adv_bearer_emit_sent();
426 }
427 
428 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){
429 
430     transport_pdu_len = strlen(control_pdu) / 2;
431     btstack_parse_hex(control_pdu, transport_pdu_len, transport_pdu_data);
432 
433     mesh_pdu_t * pdu;
434     if (count == 1 ){
435         // send as unsegmented access pdu
436         mesh_message_pdu_t * message_pdu = mesh_message_pdu_get();
437         mesh_network_pdu_t * segment     = mesh_network_pdu_get();
438         btstack_linked_list_add(&message_pdu->segments, (btstack_linked_item_t *) segment);
439         pdu = (mesh_pdu_t*) message_pdu;
440     } else {
441         // send as segmented access pdu
442         pdu = (mesh_pdu_t*) mesh_transport_pdu_get();
443     }
444     mesh_upper_transport_setup_access_pdu(pdu, netkey_index, appkey_index, ttl, src, dest, szmic, transport_pdu_data, transport_pdu_len);
445     mesh_upper_transport_send_access_pdu(pdu);
446 
447     // check for all network pdus
448     int i;
449     for (i=0;i<count;i++){
450         // parse expected network pdu
451         test_network_pdu_len = strlen(network_pdus[i]) / 2;
452         btstack_parse_hex(network_pdus[i], test_network_pdu_len, test_network_pdu_data);
453 
454 #ifdef ENABLE_MESH_GATT_BEARER
455         expect_gatt_network_pdu(test_network_pdu_data, test_network_pdu_len);
456 #endif
457 
458 #ifdef ENABLE_MESH_ADV_BEARER
459         expect_adv_network_pdu(test_network_pdu_data, test_network_pdu_len);
460 #endif
461     }
462 }
463 
464 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){
465 
466     transport_pdu_len = strlen(control_pdu) / 2;
467     btstack_parse_hex(control_pdu, transport_pdu_len, transport_pdu_data);
468 
469     uint8_t opcode = transport_pdu_data[0];
470 
471     mesh_pdu_t * pdu;
472     if (transport_pdu_len < 12){
473         // send as unsegmented control pdu
474         pdu = (mesh_pdu_t *) mesh_network_pdu_get();
475     } else {
476         // send as segmented control pdu
477         pdu = (mesh_pdu_t *) mesh_transport_pdu_get();
478     }
479     mesh_upper_transport_setup_control_pdu(pdu, netkey_index, ttl, src, dest, opcode, transport_pdu_data+1, transport_pdu_len-1);
480     mesh_upper_transport_send_control_pdu(pdu);
481 
482     // check for all network pdus
483     int i;
484     for (i=0;i<count;i++){
485         // expected network pdu
486         test_network_pdu_len = strlen(network_pdus[i]) / 2;
487         btstack_parse_hex(network_pdus[i], test_network_pdu_len, test_network_pdu_data);
488 
489 #ifdef ENABLE_MESH_GATT_BEARER
490         expect_gatt_network_pdu(test_network_pdu_data, test_network_pdu_len);
491 #endif
492 
493 #ifdef ENABLE_MESH_ADV_BEARER
494         expect_adv_network_pdu(test_network_pdu_data, test_network_pdu_len);
495 #endif
496 
497     }
498 }
499 #if 1
500 // Message 1
501 char * message1_network_pdus[] = {
502     (char *) "68eca487516765b5e5bfdacbaf6cb7fb6bff871f035444ce83a670df"
503 };
504 char * message1_lower_transport_pdus[] = {
505     (char *) "034b50057e400000010000",
506 };
507 char * message1_upper_transport_pdu = (char *) "034b50057e400000010000";
508 TEST(MessageTest, Message1Receive){
509     load_network_key_nid_68();
510     mesh_set_iv_index(0x12345678);
511     test_receive_network_pdus(1, message1_network_pdus, message1_lower_transport_pdus, message1_upper_transport_pdu);
512 }
513 TEST(MessageTest, Message1Send){
514     uint16_t netkey_index = 0;
515     uint8_t  ttl          = 0;
516     uint16_t src          = 0x1201;
517     uint16_t dest         = 0xfffd;
518     uint32_t seq          = 1;
519     load_network_key_nid_68();
520     mesh_set_iv_index(0x12345678);
521     mesh_sequence_number_set(seq);
522     test_send_control_message(netkey_index, ttl, src, dest, message1_upper_transport_pdu, 1, message1_lower_transport_pdus, message1_network_pdus);
523 }
524 
525 // Message 2
526 char * message2_network_pdus[] = {
527     (char *) "68d4c826296d7979d7dbc0c9b4d43eebec129d20a620d01e"
528 };
529 char * message2_lower_transport_pdus[] = {
530     (char *) "04320308ba072f",
531 };
532 char * message2_upper_transport_pdu = (char *) "04320308ba072f";
533 TEST(MessageTest, Message2Receive){
534     load_network_key_nid_68();
535     mesh_set_iv_index(0x12345678);
536     test_receive_network_pdus(1, message2_network_pdus, message2_lower_transport_pdus, message2_upper_transport_pdu);
537 }
538 TEST(MessageTest, Message2Send){
539     uint16_t netkey_index = 0;
540     uint8_t  ttl          = 0;
541     uint16_t src          = 0x2345;
542     uint16_t dest         = 0x1201;
543     uint32_t seq          = 0x014820;
544     load_network_key_nid_68();
545     mesh_set_iv_index(0x12345678);
546     mesh_sequence_number_set(seq);
547     test_send_control_message(netkey_index, ttl, src, dest, message2_upper_transport_pdu, 1, message2_lower_transport_pdus, message2_network_pdus);
548 }
549 
550 // Message 3
551 char * message3_network_pdus[] = {
552     (char *) "68da062bc96df253273086b8c5ee00bdd9cfcc62a2ddf572"
553 };
554 char * message3_lower_transport_pdus[] = {
555     (char *) "04fa0205a6000a",
556 };
557 char * message3_upper_transport_pdu = (char *) "04fa0205a6000a";
558 TEST(MessageTest, Message3Receive){
559     load_network_key_nid_68();
560     mesh_set_iv_index(0x12345678);
561     test_receive_network_pdus(1, message3_network_pdus, message3_lower_transport_pdus, message3_upper_transport_pdu);
562 }
563 TEST(MessageTest, Message3Send){
564     uint16_t netkey_index = 0;
565     uint8_t  ttl          = 0;
566     uint16_t src          = 0x2fe3;
567     uint16_t dest         = 0x1201;
568     uint32_t seq          = 0x2b3832;
569     load_network_key_nid_68();
570     mesh_set_iv_index(0x12345678);
571     mesh_sequence_number_set(seq);
572     test_send_control_message(netkey_index, ttl, src, dest, message3_upper_transport_pdu, 1, message3_lower_transport_pdus, message3_network_pdus);
573 }
574 
575 // Message 4
576 char * message4_network_pdus[] = {
577     (char *) "5e84eba092380fb0e5d0ad970d579a4e88051c"
578 };
579 char * message4_lower_transport_pdus[] = {
580     (char *) "0100",
581 };
582 char * message4_upper_transport_pdu = (char *) "0100";
583 TEST(MessageTest, Message4Receive){
584     load_network_key_nid_5e();
585     mesh_set_iv_index(0x12345678);
586     test_receive_network_pdus(1, message4_network_pdus, message4_lower_transport_pdus, message4_upper_transport_pdu);
587 }
588 TEST(MessageTest, Message4Send){
589     uint16_t netkey_index = 0;
590     uint8_t  ttl          = 0;
591     uint16_t src          = 0x1201;
592     uint16_t dest         = 0x2345;
593     uint32_t seq          = 0x000002;
594     load_network_key_nid_5e();
595     mesh_set_iv_index(0x12345678);
596     mesh_sequence_number_set(seq);
597     test_send_control_message(netkey_index, ttl, src, dest, message4_upper_transport_pdu, 1, message4_lower_transport_pdus, message4_network_pdus);
598 }
599 
600 // Message 5
601 char * message5_network_pdus[] = {
602     (char *) "5eafd6f53c43db5c39da1792b1fee9ec74b786c56d3a9dee",
603 };
604 char * message5_lower_transport_pdus[] = {
605     (char *) "02001234567800",
606 };
607 char * message5_upper_transport_pdu = (char *) "02001234567800";
608 TEST(MessageTest, Message5Receive){
609     load_network_key_nid_5e();
610     mesh_set_iv_index(0x12345678);
611     test_receive_network_pdus(1, message5_network_pdus, message5_lower_transport_pdus, message5_upper_transport_pdu);
612 }
613 TEST(MessageTest, Message5Send){
614     uint16_t netkey_index = 0;
615     uint8_t  ttl          = 0;
616     uint16_t src          = 0x2345;
617     uint16_t dest         = 0x1201;
618     uint32_t seq          = 0x014834;
619     load_network_key_nid_5e();
620     mesh_set_iv_index(0x12345678);
621     mesh_sequence_number_set(seq);
622     test_send_control_message(netkey_index, ttl, src, dest, message5_upper_transport_pdu, 1, message5_lower_transport_pdus, message5_network_pdus);
623 }
624 
625 // Message 6
626 char * message6_network_pdus[] = {
627     (char *) "68cab5c5348a230afba8c63d4e686364979deaf4fd40961145939cda0e",
628     (char *) "681615b5dd4a846cae0c032bf0746f44f1b8cc8ce5edc57e55beed49c0",
629 };
630 char * message6_lower_transport_pdus[] = {
631     (char *) "8026ac01ee9dddfd2169326d23f3afdf",
632     (char *) "8026ac21cfdc18c52fdef772e0e17308",
633 };
634 char * message6_upper_transport_pdu = (char *) "0056341263964771734fbd76e3b40519d1d94a48";
635 TEST(MessageTest, Message6Receive){
636     load_network_key_nid_68();
637     mesh_set_iv_index(0x12345678);
638     test_receive_network_pdus(2, message6_network_pdus, message6_lower_transport_pdus, message6_upper_transport_pdu);
639 }
640 TEST(MessageTest, Message6Send){
641     uint16_t netkey_index = 0;
642     uint16_t appkey_index = MESH_DEVICE_KEY_INDEX;
643     uint8_t  ttl          = 4;
644     uint16_t src          = 0x0003;
645     uint16_t dest         = 0x1201;
646     uint32_t seq          = 0x3129ab;
647     uint8_t  szmic        = 0;
648 
649     load_network_key_nid_68();
650     mesh_set_iv_index(0x12345678);
651     mesh_sequence_number_set(seq);
652     test_send_access_message(netkey_index, appkey_index, ttl, src, dest, szmic, message6_upper_transport_pdu, 2, message6_lower_transport_pdus, message6_network_pdus);
653 }
654 
655 // Message 7 - ACK
656 char * message7_network_pdus[] = {
657     (char *) "68e476b5579c980d0d730f94d7f3509df987bb417eb7c05f",
658 };
659 char * message7_lower_transport_pdus[] = {
660     (char *) "00a6ac00000002",
661 };
662 char * message7_upper_transport_pdu = (char *) "00a6ac00000002";
663 TEST(MessageTest, Message7Send){
664     uint16_t netkey_index = 0;
665     uint8_t  ttl          = 0x0b;
666     uint16_t src          = 0x2345;
667     uint16_t dest         = 0x0003;
668     uint32_t seq          = 0x014835;
669 
670     load_network_key_nid_68();
671     mesh_set_iv_index(0x12345678);
672     mesh_sequence_number_set(seq);
673     test_send_control_message(netkey_index, ttl, src, dest, message7_upper_transport_pdu, 1, message7_lower_transport_pdus, message7_network_pdus);
674 }
675 // ACK message, handled in mesh_transport - can be checked with test_control_receive_network_pdu
676 // TEST(MessageTest, Message7Receive){
677 //     mesh_set_iv_index(0x12345678);
678 //     test_receive_network_pdus(1, message7_network_pdus, message7_lower_transport_pdus, message7_upper_transport_pdu);
679 // }
680 
681 // Message 8 - ACK
682 char * message8_network_pdus[] = {
683     (char *) "684daa6267c2cf0e2f91add6f06e66006844cec97f973105ae2534f958",
684 };
685 char * message8_lower_transport_pdus[] = {
686     (char *) "8026ac01ee9dddfd2169326d23f3afdf",
687 };
688 char * message8_upper_transport_pdu = (char *) "8026ac01ee9dddfd2169326d23f3afdf";
689 // ACK message, handled in mesh_transport - can be checked with test_control_receive_network_pdu
690 // TEST(MessageTest, Message8Receive){
691 //     mesh_set_iv_index(0x12345678);
692 //     test_receive_network_pdus(1, message8_network_pdus, message8_lower_transport_pdus, message8_upper_transport_pdu);
693 // }
694 
695 // Message 9 - ACK
696 
697 // Message 10
698 char * message10_network_pdus[] = {
699     (char *) "5e7b786568759f7777ed355afaf66d899c1e3d",
700 };
701 char * message10_lower_transport_pdus[] = {
702     (char *) "0101",
703 };
704 char * message10_upper_transport_pdu = (char *) "0101";
705 TEST(MessageTest, Message10Receive){
706     load_network_key_nid_5e();
707     mesh_set_iv_index(0x12345678);
708     test_receive_network_pdus(1, message10_network_pdus, message10_lower_transport_pdus, message10_upper_transport_pdu);
709 }
710 TEST(MessageTest, Message10Send){
711     uint16_t netkey_index = 0;
712     uint8_t  ttl          = 0;
713     uint16_t src          = 0x1201;
714     uint16_t dest         = 0x2345;
715     uint32_t seq          = 0x000003;
716 
717     load_network_key_nid_5e();
718     mesh_set_iv_index(0x12345678);
719     mesh_sequence_number_set(seq);
720     test_send_control_message(netkey_index, ttl, src, dest, message10_upper_transport_pdu, 1, message10_lower_transport_pdus, message10_network_pdus);
721 }
722 
723 // Message 11
724 // The Friend node responds to this poll with the first segment of the stored message. It also indicates that it has more data.
725 
726 // Message 12
727 char * message12_network_pdus[] = {
728     (char *) "5e8a18fc6e4d05ae21466087599c2426ce9a35",
729 };
730 char * message12_lower_transport_pdus[] = {
731     (char *) "0101",
732 };
733 char * message12_upper_transport_pdu = (char *) "0101";
734 TEST(MessageTest, Message12Receive){
735     load_network_key_nid_5e();
736     mesh_set_iv_index(0x12345678);
737     test_receive_network_pdus(1, message12_network_pdus, message12_lower_transport_pdus, message12_upper_transport_pdu);
738 }
739 TEST(MessageTest, Message12Send){
740     uint16_t netkey_index = 0;
741     uint8_t  ttl          = 0;
742     uint16_t src          = 0x1201;
743     uint16_t dest         = 0x2345;
744     uint32_t seq          = 0x000004;
745 
746     load_network_key_nid_5e();
747     mesh_set_iv_index(0x12345678);
748     mesh_sequence_number_set(seq);
749     test_send_control_message(netkey_index, ttl, src, dest, message12_upper_transport_pdu, 1, message12_lower_transport_pdus, message12_network_pdus);
750 }
751 
752 // Message 13
753 // The Friend node responds with the same message as last time.
754 // Message 14
755 // The Low Power node received the retransmitted stored message. As that message has the MD bit set
756 // it sends another Friend Poll to obtain the next message.
757 char * message14_network_pdus[] = {
758     (char *) "5e0bbaf92b5c8f7d3ae62a3c75dff683dce24e",
759 };
760 char * message14_lower_transport_pdus[] = {
761     (char *) "0100",
762 };
763 char * message14_upper_transport_pdu = (char *) "0100";
764 TEST(MessageTest, Message14Receive){
765     load_network_key_nid_5e();
766     mesh_set_iv_index(0x12345678);
767     test_receive_network_pdus(1, message14_network_pdus, message14_lower_transport_pdus, message14_upper_transport_pdu);
768 }
769 TEST(MessageTest, Message14Send){
770     uint16_t netkey_index = 0;
771     uint8_t  ttl          = 0;
772     uint16_t src          = 0x1201;
773     uint16_t dest         = 0x2345;
774     uint32_t seq          = 0x000005;
775 
776     load_network_key_nid_5e();
777     mesh_set_iv_index(0x12345678);
778     mesh_sequence_number_set(seq);
779     test_send_control_message(netkey_index, ttl, src, dest, message14_upper_transport_pdu, 1, message14_lower_transport_pdus, message14_network_pdus);
780 }
781 
782 // Message 15
783 // 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.
784 char * message15_network_pdus[] = {
785     (char *) "5ea8dab50e7ee7f1d29805664d235eacd707217dedfe78497fefec7391",
786 };
787 char * message15_lower_transport_pdus[] = {
788     (char *) "8026ac21cfdc18c52fdef772e0e17308",
789 };
790 char * message15_upper_transport_pdu = (char *) "0100";
791 // ACK message, handled in mesh_transport - can be checked with test_control_receive_network_pdu
792 // not sure - no upper access message
793 // TEST(MessageTest, Message15Receive){
794 //     load_network_key_nid_5e();
795 //     mesh_set_iv_index(0x12345678);
796 //     test_receive_network_pdus(1, message15_network_pdus, message15_lower_transport_pdus, message15_upper_transport_pdu);
797 // }
798 
799 // Message 16
800 char * message16_network_pdus[] = {
801     (char *) "68e80e5da5af0e6b9be7f5a642f2f98680e61c3a8b47f228",
802 };
803 char * message16_lower_transport_pdus[] = {
804     (char *) "0089511bf1d1a81c11dcef",
805 };
806 char * message16_upper_transport_pdu = (char *) "800300563412";
807 TEST(MessageTest, Message16Receive){
808     load_network_key_nid_68();
809     mesh_set_iv_index(0x12345678);
810     test_receive_network_pdus(1, message16_network_pdus, message16_lower_transport_pdus, message16_upper_transport_pdu);
811 }
812 TEST(MessageTest, Message16Send){
813     uint16_t netkey_index = 0;
814     uint16_t appkey_index = MESH_DEVICE_KEY_INDEX;
815     uint8_t  ttl          = 0x0b;
816     uint16_t src          = 0x1201;
817     uint16_t dest         = 0x0003;
818     uint32_t seq          = 0x000006;
819     uint8_t  szmic        = 0;
820 
821     load_network_key_nid_68();
822     mesh_set_iv_index(0x12345678);
823     mesh_sequence_number_set(seq);
824     test_send_access_message(netkey_index, appkey_index, ttl, src, dest, szmic, message16_upper_transport_pdu, 1, message16_lower_transport_pdus, message16_network_pdus);
825 }
826 
827 // Message 17
828 // A Relay node receives the message from the Low Power node and relays it, decrementing the TTL value.
829 // Message 18
830 char * message18_network_pdus[] = {
831     (char *) "6848cba437860e5673728a627fb938535508e21a6baf57",
832 };
833 char * message18_lower_transport_pdus[] = {
834     (char *) "665a8bde6d9106ea078a",
835 };
836 char * message18_upper_transport_pdu = (char *) "0400000000";
837 TEST(MessageTest, Message18Receive){
838     load_network_key_nid_68();
839     mesh_set_iv_index(0x12345678);
840     test_receive_network_pdus(1, message18_network_pdus, message18_lower_transport_pdus, message18_upper_transport_pdu);
841 }
842 TEST(MessageTest, Message18Send){
843     uint16_t netkey_index = 0;
844     uint16_t appkey_index = 0;
845     uint8_t  ttl          = 3;
846     uint16_t src          = 0x1201;
847     uint16_t dest         = 0xffff;
848     uint32_t seq          = 0x00007;
849     uint8_t  szmic        = 0;
850 
851     load_network_key_nid_68();
852     mesh_set_iv_index(0x12345678);
853     mesh_sequence_number_set(seq);
854     test_send_access_message(netkey_index, appkey_index, ttl, src, dest, szmic, message18_upper_transport_pdu, 1, message18_lower_transport_pdus, message18_network_pdus);
855 }
856 
857 
858 // Message 19
859 // The Low Power node sends another Health Current Status message indicating that there are three faults:
860 // Battery Low Warning, Power Supply Interrupted Warning, and Supply Voltage Too Low Warning.
861 char * message19_network_pdus[] = {
862     (char *) "68110edeecd83c3010a05e1b23a926023da75d25ba91793736",
863 };
864 char * message19_lower_transport_pdus[] = {
865     (char *) "66ca6cd88e698d1265f43fc5",
866 };
867 char * message19_upper_transport_pdu = (char *) "04000000010703";
868 TEST(MessageTest, Message19Receive){
869     load_network_key_nid_68();
870     mesh_set_iv_index(0x12345678);
871     test_receive_network_pdus(1, message19_network_pdus, message19_lower_transport_pdus, message19_upper_transport_pdu);
872 }
873 TEST(MessageTest, Message19Send){
874     uint16_t netkey_index = 0;
875     uint16_t appkey_index = 0;
876     uint8_t  ttl          = 3;
877     uint16_t src          = 0x1201;
878     uint16_t dest         = 0xffff;
879     uint32_t seq          = 0x00009;
880     uint8_t  szmic        = 0;
881 
882     load_network_key_nid_68();
883     mesh_set_iv_index(0x12345678);
884     mesh_sequence_number_set(seq);
885     test_send_access_message(netkey_index, appkey_index, ttl, src, dest, szmic, message19_upper_transport_pdu, 1, message19_lower_transport_pdus, message19_network_pdus);
886 }
887 
888 // Message 20
889 char * message20_network_pdus[] = {
890     (char *) "e85cca51e2e8998c3dc87344a16c787f6b08cc897c941a5368",
891 };
892 char * message20_lower_transport_pdus[] = {
893     (char *) "669c9803e110fea929e9542d",
894 };
895 char * message20_upper_transport_pdu = (char *) "04000000010703";
896 TEST(MessageTest, Message20Receive){
897     load_network_key_nid_68();
898     mesh_set_iv_index(0x12345677);
899     test_receive_network_pdus(1, message20_network_pdus, message20_lower_transport_pdus, message20_upper_transport_pdu);
900 }
901 TEST(MessageTest, Message20Send){
902     uint16_t netkey_index = 0;
903     uint16_t appkey_index = 0;
904     uint8_t  ttl          = 3;
905     uint16_t src          = 0x1234;
906     uint16_t dest         = 0xffff;
907     uint32_t seq          = 0x070809;
908     uint8_t  szmic        = 0;
909 
910     load_network_key_nid_68();
911     mesh_set_iv_index(0x12345677);
912     mesh_sequence_number_set(seq);
913     test_send_access_message(netkey_index, appkey_index, ttl, src, dest, szmic, message20_upper_transport_pdu, 1, message20_lower_transport_pdus, message20_network_pdus);
914 }
915 
916 // Message 21
917 // The Low Power node sends a vendor command to a group address.
918 char * message21_network_pdus[] = {
919     (char *) "e84e8fbe003f58a4d61157bb76352ea6307eebfe0f30b83500e9",
920 };
921 char * message21_lower_transport_pdus[] = {
922     (char *) "664d92e9dfcf3ab85b6e8fcf03",
923 };
924 char * message21_upper_transport_pdu = (char *) "d50a0048656c6c6f";
925 TEST(MessageTest, Message21Receive){
926     load_network_key_nid_68();
927     mesh_set_iv_index(0x12345677);
928     test_receive_network_pdus(1, message21_network_pdus, message21_lower_transport_pdus, message21_upper_transport_pdu);
929 }
930 TEST(MessageTest, Message21Send){
931     uint16_t netkey_index = 0;
932     uint16_t appkey_index = 0;
933     uint8_t  ttl          = 3;
934     uint16_t src          = 0x1234;
935     uint16_t dest         = 0xc105;
936     uint32_t seq          = 0x07080a;
937     uint8_t  szmic        = 0;
938 
939     load_network_key_nid_68();
940     mesh_set_iv_index(0x12345677);
941     mesh_sequence_number_set(seq);
942     test_send_access_message(netkey_index, appkey_index, ttl, src, dest, szmic, message21_upper_transport_pdu, 1, message21_lower_transport_pdus, message21_network_pdus);
943 }
944 
945 // Message 22
946 char * message22_network_pdus[] = {
947     (char *) "e8d85caecef1e3ed31f3fdcf88a411135fea55df730b6b28e255",
948 };
949 char * message22_lower_transport_pdus[] = {
950     (char *) "663871b904d431526316ca48a0",
951 };
952 char * message22_upper_transport_pdu = (char *) "d50a0048656c6c6f";
953 char * message22_label_string = (char *) "0073e7e4d8b9440faf8415df4c56c0e1";
954 
955 TEST(MessageTest, Message22Receive){
956     load_network_key_nid_68();
957     mesh_set_iv_index(0x12345677);
958     uint8_t label_uuid[16];
959     btstack_parse_hex(message22_label_string, 16, label_uuid);
960     mesh_virtual_address_register(label_uuid, 0xb529);
961     test_receive_network_pdus(1, message22_network_pdus, message22_lower_transport_pdus, message22_upper_transport_pdu);
962 }
963 
964 TEST(MessageTest, Message22Send){
965     uint16_t netkey_index = 0;
966     uint16_t appkey_index = 0;
967     uint8_t  ttl          = 3;
968     uint16_t src          = 0x1234;
969     uint32_t seq          = 0x07080b;
970     uint8_t  szmic        = 0;
971 
972     load_network_key_nid_68();
973     mesh_set_iv_index(0x12345677);
974     mesh_sequence_number_set(seq);
975     uint8_t label_uuid[16];
976     btstack_parse_hex(message22_label_string, 16, label_uuid);
977     mesh_virtual_address_t * virtual_address = mesh_virtual_address_register(label_uuid, 0xb529);
978     uint16_t pseudo_dst = virtual_address->pseudo_dst;
979     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);
980 }
981 
982 // Message 23
983 char * message23_network_pdus[] = {
984     (char *) "e877a48dd5fe2d7a9d696d3dd16a75489696f0b70c711b881385",
985 };
986 char * message23_lower_transport_pdus[] = {
987     (char *) "662456db5e3100eef65daa7a38",
988 };
989 char * message23_upper_transport_pdu = (char *) "d50a0048656c6c6f";
990 char * message23_label_string = (char *) "f4a002c7fb1e4ca0a469a021de0db875";
991 
992 TEST(MessageTest, Message23Receive){
993     load_network_key_nid_68();
994     mesh_set_iv_index(0x12345677);
995     uint8_t label_uuid[16];
996     btstack_parse_hex(message23_label_string, 16, label_uuid);
997     mesh_virtual_address_register(label_uuid, 0x9736);
998     test_receive_network_pdus(1, message23_network_pdus, message23_lower_transport_pdus, message23_upper_transport_pdu);
999 }
1000 TEST(MessageTest, Message23Send){
1001     uint16_t netkey_index = 0;
1002     uint16_t appkey_index = 0;
1003     uint8_t  ttl          = 3;
1004     uint16_t src          = 0x1234;
1005     uint32_t seq          = 0x07080c;
1006     uint8_t  szmic        = 0;
1007 
1008     load_network_key_nid_68();
1009     mesh_set_iv_index(0x12345677);
1010     mesh_sequence_number_set(seq);
1011     uint8_t label_uuid[16];
1012     btstack_parse_hex(message23_label_string, 16, label_uuid);
1013     mesh_virtual_address_t * virtual_address = mesh_virtual_address_register(label_uuid, 0x9736);
1014     uint16_t pseudo_dst = virtual_address->pseudo_dst;
1015     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);
1016 }
1017 #endif
1018 
1019 // Message 24
1020 char * message24_network_pdus[] = {
1021     (char *) "e8624e65bb8c1794e998b4081f47a35251fdd3896d99e4db489b918599",
1022     (char *) "e8a7d0f0a2ea42dc2f4dd6fb4db33a6c088d023b47",
1023 };
1024 char * message24_lower_transport_pdus[] = {
1025     (char *) "e6a03401c3c51d8e476b28e3aa5001f3",
1026     (char *) "e6a034211c01cea6",
1027 };
1028 char * message24_upper_transport_pdu = (char *) "ea0a00576f726c64";
1029 char * message24_label_string = (char *) "f4a002c7fb1e4ca0a469a021de0db875";
1030 TEST(MessageTest, Message24Receive){
1031     load_network_key_nid_68();
1032     mesh_set_iv_index(0x12345677);
1033     uint8_t label_uuid[16];
1034     btstack_parse_hex(message24_label_string, 16, label_uuid);
1035     mesh_virtual_address_register(label_uuid, 0x9736);
1036     test_receive_network_pdus(2, message24_network_pdus, message24_lower_transport_pdus, message24_upper_transport_pdu);
1037 }
1038 TEST(MessageTest, Message24Send){
1039     uint16_t netkey_index = 0;
1040     uint16_t appkey_index = 0;
1041     uint8_t  ttl          = 3;
1042     uint16_t src          = 0x1234;
1043     uint32_t seq          = 0x07080d;
1044     uint8_t  szmic        = 1;
1045 
1046     load_network_key_nid_68();
1047     mesh_set_iv_index(0x12345677);
1048     mesh_sequence_number_set(seq);
1049     uint8_t label_uuid[16];
1050     btstack_parse_hex(message24_label_string, 16, label_uuid);
1051     mesh_virtual_address_t * virtual_address = mesh_virtual_address_register(label_uuid, 0x9736);
1052     uint16_t pseudo_dst = virtual_address->pseudo_dst;
1053     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);
1054 }
1055 
1056 // Proxy Configuration Test
1057 char * proxy_config_pdus[] = {
1058     (char *) "0210386bd60efbbb8b8c28512e792d3711f4b526",
1059 };
1060 char * proxy_config_lower_transport_pdus[] = {
1061     (char *) "0000",
1062 };
1063 char * proxy_config_upper_transport_pdu = (char *) "ea0a00576f726c64";
1064 TEST(MessageTest, ProxyConfigReceive){
1065     mesh_set_iv_index(0x12345678);
1066     load_network_key_nid_10();
1067     int i = 0;
1068     char ** network_pdus = proxy_config_pdus;
1069     test_network_pdu_len = strlen(network_pdus[i]) / 2;
1070     btstack_parse_hex(network_pdus[i], test_network_pdu_len, test_network_pdu_data);
1071     mesh_network_process_proxy_configuration_message(&test_network_pdu_data[1], test_network_pdu_len-1);
1072     while (received_proxy_pdu == NULL) {
1073         mock_process_hci_cmd();
1074     }
1075     char ** lower_transport_pdus = proxy_config_lower_transport_pdus;
1076     transport_pdu_len = strlen(lower_transport_pdus[i]) / 2;
1077     btstack_parse_hex(lower_transport_pdus[i], transport_pdu_len, transport_pdu_data);
1078 
1079     uint8_t * lower_transport_pdu     = mesh_network_pdu_data(received_proxy_pdu);
1080     uint8_t   lower_transport_pdu_len = mesh_network_pdu_len(received_proxy_pdu);
1081 
1082     // printf_hexdump(lower_transport_pdu, lower_transport_pdu_len);
1083 
1084     CHECK_EQUAL( transport_pdu_len, lower_transport_pdu_len);
1085     CHECK_EQUAL_ARRAY(transport_pdu_data, lower_transport_pdu, transport_pdu_len);
1086 
1087     // done
1088     mesh_network_message_processed_by_higher_layer(received_proxy_pdu);
1089     received_proxy_pdu = NULL;
1090 }
1091 
1092 static void test_proxy_callback_handler(mesh_network_pdu_t * network_pdu){
1093     received_proxy_pdu = network_pdu;
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, &test_proxy_callback_handler);
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