1 #include <stdio.h> 2 #include <stdint.h> 3 #include "btstack_util.h" 4 #include "aes_ccm.h" 5 #include "btstack_crypto.h" 6 7 typedef uint8_t key_t[16]; 8 9 #define LOG_KEY(NAME) { printf("%16s: ", #NAME); printf_hexdump(NAME, 16); } 10 #define PARSE_KEY(NAME) { parse_hex(NAME, NAME##_string); LOG_KEY(NAME); } 11 #define DEFINE_KEY(NAME, VALUE) key_t NAME; parse_hex(NAME, VALUE); LOG_KEY(NAME); 12 13 static int parse_hex(uint8_t * buffer, const char * hex_string){ 14 int len = 0; 15 while (*hex_string){ 16 if (*hex_string == ' '){ 17 hex_string++; 18 continue; 19 } 20 int high_nibble = nibble_for_char(*hex_string++); 21 int low_nibble = nibble_for_char(*hex_string++); 22 *buffer++ = (high_nibble << 4) | low_nibble; 23 len++; 24 } 25 return len; 26 } 27 28 static void ccm_done(void * arg){ 29 30 } 31 32 static void message_24_upper_transport_encrypt(void){ 33 printf("[+] Upper transport encrypt\n"); 34 DEFINE_KEY(label_uuid, "f4a002c7fb1e4ca0a469a021de0db875"); 35 DEFINE_KEY(app_key, "63964771734fbd76e3b40519d1d94a48"); 36 37 uint8_t app_nonce[13]; 38 parse_hex(app_nonce, "018007080d1234973612345677"); 39 printf("%16s: ", "app_nonce"); printf_hexdump(app_nonce, 13); 40 41 uint8_t plaintext[8]; 42 parse_hex(plaintext, "ea0a00576f726c64"); 43 printf("%16s: ", "plaintext"); printf_hexdump(plaintext, sizeof(plaintext)); 44 45 printf("Reference:\n"); 46 uint8_t ciphertext[8+8]; 47 bt_mesh_ccm_encrypt(app_key, app_nonce, plaintext, sizeof(plaintext), label_uuid, sizeof(label_uuid), ciphertext, 8); 48 printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 8); 49 printf("%16s: ", "TransMIC"); printf_hexdump(&ciphertext[8], 8); 50 51 // btstack_crypto 52 printf("btstack_crypto:\n"); 53 uint8_t trans_mic[8]; 54 btstack_crypto_init(); 55 btstack_crypto_ccm_t btstack_crypto_ccm; 56 btstack_crypto_ccm_init(&btstack_crypto_ccm, app_key, app_nonce, sizeof(plaintext), sizeof(label_uuid), sizeof(trans_mic)); 57 btstack_crypto_ccm_digest(&btstack_crypto_ccm, label_uuid, 16, &ccm_done, NULL); 58 btstack_crypto_ccm_encrypt_block(&btstack_crypto_ccm, sizeof(plaintext), plaintext, ciphertext, &ccm_done, NULL); 59 btstack_crypto_ccm_get_authentication_value(&btstack_crypto_ccm, trans_mic); 60 printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 8); 61 printf("%16s: ", "TransMIC"); printf_hexdump(trans_mic, 8); 62 } 63 64 static void message_24_upper_transport_decrypt(void){ 65 printf("[+] Upper transport decrypt\n"); 66 DEFINE_KEY(label_uuid, "f4a002c7fb1e4ca0a469a021de0db875"); 67 DEFINE_KEY(app_key, "63964771734fbd76e3b40519d1d94a48"); 68 69 uint8_t app_nonce[13]; 70 parse_hex(app_nonce, "018007080d1234973612345677"); 71 printf("%16s: ", "app_nonce"); printf_hexdump(app_nonce, 13); 72 73 74 uint8_t ciphertext[8]; 75 parse_hex(ciphertext, "c3c51d8e476b28e3"); 76 printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, sizeof(ciphertext)); 77 78 printf("Reference:\n"); 79 uint8_t plaintext[8+8]; 80 bt_mesh_ccm_decrypt(app_key, app_nonce, ciphertext, sizeof(ciphertext), label_uuid, sizeof(label_uuid), plaintext, 8); 81 printf("%16s: ", "plaintext"); printf_hexdump(plaintext, 8); 82 printf("%16s: ", "TransMIC"); printf_hexdump(&plaintext[8], 8); 83 84 // btstack_crypto 85 printf("btstack_crypto:\n"); 86 uint8_t trans_mic[8]; 87 btstack_crypto_init(); 88 btstack_crypto_ccm_t btstack_crypto_ccm; 89 btstack_crypto_ccm_init(&btstack_crypto_ccm, app_key, app_nonce, sizeof(ciphertext), sizeof(label_uuid), sizeof(trans_mic)); 90 btstack_crypto_ccm_digest(&btstack_crypto_ccm, label_uuid, 16, &ccm_done, NULL); 91 btstack_crypto_ccm_decrypt_block(&btstack_crypto_ccm, sizeof(ciphertext), ciphertext, plaintext, &ccm_done, NULL); 92 btstack_crypto_ccm_get_authentication_value(&btstack_crypto_ccm, trans_mic); 93 printf("%16s: ", "plaintext"); printf_hexdump(plaintext, 8); 94 printf("%16s: ", "TransMIC"); printf_hexdump(trans_mic, 8); 95 } 96 97 static void message_24_lower_transport_segment_0(void){ 98 printf("[+] Lower Transport Segment 0\n"); 99 DEFINE_KEY(encryption_key, "0953fa93e7caac9638f58820220a398e"); 100 101 uint8_t network_nonce[13]; 102 parse_hex(network_nonce, "000307080d1234000012345677"); 103 printf("%16s: ", "network_nonce"); printf_hexdump(network_nonce, 13); 104 105 uint8_t plaintext[18]; 106 parse_hex(plaintext, "9736e6a03401de1547118463123e5f6a17b9"); 107 printf("%16s: ", "plaintext"); printf_hexdump(plaintext, sizeof(plaintext)); 108 109 printf("Reference:\n"); 110 uint8_t ciphertext[18+4]; 111 bt_mesh_ccm_encrypt(encryption_key, network_nonce, plaintext, sizeof(plaintext), NULL, 0, ciphertext, 4); 112 printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 18); 113 printf("%16s: ", "NetMIC"); printf_hexdump(&ciphertext[18], 4); 114 115 // btstack_crypto 116 printf("btstack_crypto:\n"); 117 uint8_t net_mic[4]; 118 btstack_crypto_init(); 119 btstack_crypto_ccm_t btstack_crypto_ccm; 120 btstack_crypto_ccm_init(&btstack_crypto_ccm, encryption_key, network_nonce, sizeof(plaintext), 0, 4); 121 btstack_crypto_ccm_encrypt_block(&btstack_crypto_ccm, sizeof(plaintext), plaintext, ciphertext, &ccm_done, NULL); 122 btstack_crypto_ccm_get_authentication_value(&btstack_crypto_ccm, net_mic); 123 printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 18); 124 printf("%16s: ", "NetMIC"); printf_hexdump(net_mic, 4); 125 } 126 127 int main(void){ 128 message_24_upper_transport_encrypt(); 129 message_24_upper_transport_decrypt(); 130 message_24_lower_transport_segment_0(); 131 return 0; 132 } 133