181132a39SMatthias Ringwald #include <stdio.h> 281132a39SMatthias Ringwald #include <stdint.h> 381132a39SMatthias Ringwald #include "btstack_util.h" 4ba1e2dc4SMatthias Ringwald #include "aes_ccm.h" 5995faa29SMatthias Ringwald #include "btstack_crypto.h" 675ba91cfSMatthias Ringwald 781132a39SMatthias Ringwald typedef uint8_t key_t[16]; 881132a39SMatthias Ringwald 981132a39SMatthias Ringwald #define LOG_KEY(NAME) { printf("%16s: ", #NAME); printf_hexdump(NAME, 16); } 1081132a39SMatthias Ringwald #define PARSE_KEY(NAME) { parse_hex(NAME, NAME##_string); LOG_KEY(NAME); } 1181132a39SMatthias Ringwald #define DEFINE_KEY(NAME, VALUE) key_t NAME; parse_hex(NAME, VALUE); LOG_KEY(NAME); 1281132a39SMatthias Ringwald 1381132a39SMatthias Ringwald static int parse_hex(uint8_t * buffer, const char * hex_string){ 1481132a39SMatthias Ringwald int len = 0; 1581132a39SMatthias Ringwald while (*hex_string){ 1681132a39SMatthias Ringwald if (*hex_string == ' '){ 1781132a39SMatthias Ringwald hex_string++; 1881132a39SMatthias Ringwald continue; 1981132a39SMatthias Ringwald } 2081132a39SMatthias Ringwald int high_nibble = nibble_for_char(*hex_string++); 2181132a39SMatthias Ringwald int low_nibble = nibble_for_char(*hex_string++); 2281132a39SMatthias Ringwald *buffer++ = (high_nibble << 4) | low_nibble; 2381132a39SMatthias Ringwald len++; 2481132a39SMatthias Ringwald } 2581132a39SMatthias Ringwald return len; 2681132a39SMatthias Ringwald } 2781132a39SMatthias Ringwald 28995faa29SMatthias Ringwald static void ccm_done(void * arg){ 29995faa29SMatthias Ringwald 30995faa29SMatthias Ringwald } 31995faa29SMatthias Ringwald 32f88ad41fSMatthias Ringwald static void message_24_upper_transport_encrypt(void){ 33f88ad41fSMatthias Ringwald printf("[+] Upper transport encrypt\n"); 34f88ad41fSMatthias Ringwald DEFINE_KEY(label_uuid, "f4a002c7fb1e4ca0a469a021de0db875"); 35f88ad41fSMatthias Ringwald DEFINE_KEY(app_key, "63964771734fbd76e3b40519d1d94a48"); 36f88ad41fSMatthias Ringwald 37f88ad41fSMatthias Ringwald uint8_t app_nonce[13]; 38f88ad41fSMatthias Ringwald parse_hex(app_nonce, "010007080d1234973612345677"); 39f88ad41fSMatthias Ringwald printf("%16s: ", "app_nonce"); printf_hexdump(app_nonce, 13); 40f88ad41fSMatthias Ringwald 41f88ad41fSMatthias Ringwald uint8_t plaintext[8]; 42f88ad41fSMatthias Ringwald parse_hex(plaintext, "ea0a00576f726c64"); 43f88ad41fSMatthias Ringwald printf("%16s: ", "plaintext"); printf_hexdump(plaintext, sizeof(plaintext)); 44f88ad41fSMatthias Ringwald 45f88ad41fSMatthias Ringwald printf("Reference:\n"); 46f88ad41fSMatthias Ringwald uint8_t ciphertext[8+8]; 47f88ad41fSMatthias Ringwald bt_mesh_ccm_encrypt(app_key, app_nonce, plaintext, sizeof(plaintext), label_uuid, sizeof(label_uuid), ciphertext, 8); 48f88ad41fSMatthias Ringwald printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 8); 49f88ad41fSMatthias Ringwald printf("%16s: ", "TransMIC"); printf_hexdump(&ciphertext[8], 8); 50f88ad41fSMatthias Ringwald 51f88ad41fSMatthias Ringwald // btstack_crypto 52f88ad41fSMatthias Ringwald printf("btstack_crypto:\n"); 53f88ad41fSMatthias Ringwald uint8_t trans_mic[8]; 54f88ad41fSMatthias Ringwald btstack_crypto_init(); 55f88ad41fSMatthias Ringwald btstack_crypto_ccm_t btstack_crypto_ccm; 56*03843d74SMatthias Ringwald btstack_crypto_ccm_init(&btstack_crypto_ccm, app_key, app_nonce, sizeof(plaintext), sizeof(label_uuid), sizeof(trans_mic)); 57*03843d74SMatthias Ringwald btstack_crypto_ccm_digest(&btstack_crypto_ccm, label_uuid, 16, &ccm_done, NULL); 58f88ad41fSMatthias Ringwald btstack_crypto_ccm_encrypt_block(&btstack_crypto_ccm, sizeof(plaintext), plaintext, ciphertext, &ccm_done, NULL); 59*03843d74SMatthias Ringwald btstack_crypto_ccm_get_authentication_value(&btstack_crypto_ccm, trans_mic); 60f88ad41fSMatthias Ringwald printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 8); 61f88ad41fSMatthias Ringwald printf("%16s: ", "TransMIC"); printf_hexdump(trans_mic, 8); 62f88ad41fSMatthias Ringwald } 63f88ad41fSMatthias Ringwald 64f88ad41fSMatthias Ringwald static void message_24_upper_transport_decrypt(void){ 65f88ad41fSMatthias Ringwald printf("[+] Upper transport decrypt\n"); 66f88ad41fSMatthias Ringwald DEFINE_KEY(label_uuid, "f4a002c7fb1e4ca0a469a021de0db875"); 67f88ad41fSMatthias Ringwald DEFINE_KEY(app_key, "63964771734fbd76e3b40519d1d94a48"); 68f88ad41fSMatthias Ringwald 69f88ad41fSMatthias Ringwald uint8_t app_nonce[13]; 70f88ad41fSMatthias Ringwald parse_hex(app_nonce, "010007080d1234973612345677"); 71f88ad41fSMatthias Ringwald printf("%16s: ", "app_nonce"); printf_hexdump(app_nonce, 13); 72f88ad41fSMatthias Ringwald 73f88ad41fSMatthias Ringwald 74f88ad41fSMatthias Ringwald uint8_t ciphertext[8]; 75f88ad41fSMatthias Ringwald parse_hex(ciphertext, "DE1547118463123E"); 76f88ad41fSMatthias Ringwald printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, sizeof(ciphertext)); 77f88ad41fSMatthias Ringwald 78f88ad41fSMatthias Ringwald printf("Reference:\n"); 79f88ad41fSMatthias Ringwald uint8_t plaintext[8+8]; 80f88ad41fSMatthias Ringwald bt_mesh_ccm_decrypt(app_key, app_nonce, ciphertext, sizeof(ciphertext), label_uuid, sizeof(label_uuid), plaintext, 8); 81f88ad41fSMatthias Ringwald printf("%16s: ", "plaintext"); printf_hexdump(plaintext, 8); 82f88ad41fSMatthias Ringwald printf("%16s: ", "TransMIC"); printf_hexdump(&plaintext[8], 8); 83f88ad41fSMatthias Ringwald 84f88ad41fSMatthias Ringwald // btstack_crypto 85f88ad41fSMatthias Ringwald printf("btstack_crypto:\n"); 86f88ad41fSMatthias Ringwald uint8_t trans_mic[8]; 87f88ad41fSMatthias Ringwald btstack_crypto_init(); 88f88ad41fSMatthias Ringwald btstack_crypto_ccm_t btstack_crypto_ccm; 89*03843d74SMatthias Ringwald btstack_crypto_ccm_init(&btstack_crypto_ccm, app_key, app_nonce, sizeof(ciphertext), sizeof(label_uuid), sizeof(trans_mic)); 90*03843d74SMatthias Ringwald btstack_crypto_ccm_digest(&btstack_crypto_ccm, label_uuid, 16, &ccm_done, NULL); 91f88ad41fSMatthias Ringwald btstack_crypto_ccm_decrypt_block(&btstack_crypto_ccm, sizeof(ciphertext), ciphertext, plaintext, &ccm_done, NULL); 92*03843d74SMatthias Ringwald btstack_crypto_ccm_get_authentication_value(&btstack_crypto_ccm, trans_mic); 93f88ad41fSMatthias Ringwald printf("%16s: ", "plaintext"); printf_hexdump(plaintext, 8); 94f88ad41fSMatthias Ringwald printf("%16s: ", "TransMIC"); printf_hexdump(trans_mic, 8); 95f88ad41fSMatthias Ringwald } 96f88ad41fSMatthias Ringwald 97f88ad41fSMatthias Ringwald static void message_24_lower_transport_segment_0(void){ 98f88ad41fSMatthias Ringwald printf("[+] Lower Transport Segment 0\n"); 9981132a39SMatthias Ringwald DEFINE_KEY(encryption_key, "0953fa93e7caac9638f58820220a398e"); 10081132a39SMatthias Ringwald 10181132a39SMatthias Ringwald uint8_t network_nonce[13]; 10281132a39SMatthias Ringwald parse_hex(network_nonce, "000307080d1234000012345677"); 10381132a39SMatthias Ringwald printf("%16s: ", "network_nonce"); printf_hexdump(network_nonce, 13); 10481132a39SMatthias Ringwald 10581132a39SMatthias Ringwald uint8_t plaintext[18]; 10681132a39SMatthias Ringwald parse_hex(plaintext, "9736e6a03401de1547118463123e5f6a17b9"); 10781132a39SMatthias Ringwald printf("%16s: ", "plaintext"); printf_hexdump(plaintext, sizeof(plaintext)); 10881132a39SMatthias Ringwald 109995faa29SMatthias Ringwald printf("Reference:\n"); 11081132a39SMatthias Ringwald uint8_t ciphertext[18+4]; 11181132a39SMatthias Ringwald bt_mesh_ccm_encrypt(encryption_key, network_nonce, plaintext, sizeof(plaintext), NULL, 0, ciphertext, 4); 11281132a39SMatthias Ringwald printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 18); 11381132a39SMatthias Ringwald printf("%16s: ", "NetMIC"); printf_hexdump(&ciphertext[18], 4); 114995faa29SMatthias Ringwald 115995faa29SMatthias Ringwald // btstack_crypto 116995faa29SMatthias Ringwald printf("btstack_crypto:\n"); 117995faa29SMatthias Ringwald uint8_t net_mic[4]; 118995faa29SMatthias Ringwald btstack_crypto_init(); 119995faa29SMatthias Ringwald btstack_crypto_ccm_t btstack_crypto_ccm; 120*03843d74SMatthias Ringwald btstack_crypto_ccm_init(&btstack_crypto_ccm, encryption_key, network_nonce, sizeof(plaintext), 0, 4); 121995faa29SMatthias Ringwald btstack_crypto_ccm_encrypt_block(&btstack_crypto_ccm, sizeof(plaintext), plaintext, ciphertext, &ccm_done, NULL); 122*03843d74SMatthias Ringwald btstack_crypto_ccm_get_authentication_value(&btstack_crypto_ccm, net_mic); 123995faa29SMatthias Ringwald printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 18); 124995faa29SMatthias Ringwald printf("%16s: ", "NetMIC"); printf_hexdump(net_mic, 4); 12581132a39SMatthias Ringwald } 12681132a39SMatthias Ringwald 12781132a39SMatthias Ringwald int main(void){ 128f88ad41fSMatthias Ringwald message_24_upper_transport_encrypt(); 129f88ad41fSMatthias Ringwald message_24_upper_transport_decrypt(); 130f88ad41fSMatthias Ringwald message_24_lower_transport_segment_0(); 13181132a39SMatthias Ringwald return 0; 13281132a39SMatthias Ringwald } 133