181132a39SMatthias Ringwald #include <stdio.h> 281132a39SMatthias Ringwald #include <stdint.h> 381132a39SMatthias Ringwald #include "btstack_util.h" 4ba1e2dc4SMatthias Ringwald #include "aes_ccm.h" 5*995faa29SMatthias 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 28*995faa29SMatthias Ringwald static void ccm_done(void * arg){ 29*995faa29SMatthias Ringwald 30*995faa29SMatthias Ringwald } 31*995faa29SMatthias Ringwald 3281132a39SMatthias Ringwald static void message_24(void){ 3381132a39SMatthias Ringwald DEFINE_KEY(encryption_key, "0953fa93e7caac9638f58820220a398e"); 3481132a39SMatthias Ringwald 3581132a39SMatthias Ringwald uint8_t network_nonce[13]; 3681132a39SMatthias Ringwald parse_hex(network_nonce, "000307080d1234000012345677"); 3781132a39SMatthias Ringwald printf("%16s: ", "network_nonce"); printf_hexdump(network_nonce, 13); 3881132a39SMatthias Ringwald 3981132a39SMatthias Ringwald uint8_t plaintext[18]; 4081132a39SMatthias Ringwald parse_hex(plaintext, "9736e6a03401de1547118463123e5f6a17b9"); 4181132a39SMatthias Ringwald printf("%16s: ", "plaintext"); printf_hexdump(plaintext, sizeof(plaintext)); 4281132a39SMatthias Ringwald 43*995faa29SMatthias Ringwald printf("Reference:\n"); 4481132a39SMatthias Ringwald uint8_t ciphertext[18+4]; 4581132a39SMatthias Ringwald bt_mesh_ccm_encrypt(encryption_key, network_nonce, plaintext, sizeof(plaintext), NULL, 0, ciphertext, 4); 4681132a39SMatthias Ringwald printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 18); 4781132a39SMatthias Ringwald printf("%16s: ", "NetMIC"); printf_hexdump(&ciphertext[18], 4); 48*995faa29SMatthias Ringwald 49*995faa29SMatthias Ringwald // btstack_crypto 50*995faa29SMatthias Ringwald printf("btstack_crypto:\n"); 51*995faa29SMatthias Ringwald uint8_t net_mic[4]; 52*995faa29SMatthias Ringwald btstack_crypto_init(); 53*995faa29SMatthias Ringwald btstack_crypto_ccm_t btstack_crypto_ccm; 54*995faa29SMatthias Ringwald btstack_crypo_ccm_init(&btstack_crypto_ccm, encryption_key, network_nonce, sizeof(plaintext), 4); 55*995faa29SMatthias Ringwald btstack_crypto_ccm_encrypt_block(&btstack_crypto_ccm, sizeof(plaintext), plaintext, ciphertext, &ccm_done, NULL); 56*995faa29SMatthias Ringwald btstack_crypo_ccm_get_authentication_value(&btstack_crypto_ccm, net_mic); 57*995faa29SMatthias Ringwald printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 18); 58*995faa29SMatthias Ringwald printf("%16s: ", "NetMIC"); printf_hexdump(net_mic, 4); 5981132a39SMatthias Ringwald } 6081132a39SMatthias Ringwald 6181132a39SMatthias Ringwald int main(void){ 6281132a39SMatthias Ringwald message_24(); 6381132a39SMatthias Ringwald return 0; 6481132a39SMatthias Ringwald } 65