1*81132a39SMatthias Ringwald #include <stdio.h> 2*81132a39SMatthias Ringwald #include <stdint.h> 3*81132a39SMatthias Ringwald #include "btstack_util.h" 4*81132a39SMatthias Ringwald #include "aes_cmac.h" 5*81132a39SMatthias Ringwald #include <errno.h> 6*81132a39SMatthias Ringwald 7*81132a39SMatthias Ringwald typedef uint8_t key_t[16]; 8*81132a39SMatthias Ringwald 9*81132a39SMatthias Ringwald #define LOG_KEY(NAME) { printf("%16s: ", #NAME); printf_hexdump(NAME, 16); } 10*81132a39SMatthias Ringwald #define PARSE_KEY(NAME) { parse_hex(NAME, NAME##_string); LOG_KEY(NAME); } 11*81132a39SMatthias Ringwald #define DEFINE_KEY(NAME, VALUE) key_t NAME; parse_hex(NAME, VALUE); LOG_KEY(NAME); 12*81132a39SMatthias Ringwald 13*81132a39SMatthias Ringwald static int parse_hex(uint8_t * buffer, const char * hex_string){ 14*81132a39SMatthias Ringwald int len = 0; 15*81132a39SMatthias Ringwald while (*hex_string){ 16*81132a39SMatthias Ringwald if (*hex_string == ' '){ 17*81132a39SMatthias Ringwald hex_string++; 18*81132a39SMatthias Ringwald continue; 19*81132a39SMatthias Ringwald } 20*81132a39SMatthias Ringwald int high_nibble = nibble_for_char(*hex_string++); 21*81132a39SMatthias Ringwald int low_nibble = nibble_for_char(*hex_string++); 22*81132a39SMatthias Ringwald *buffer++ = (high_nibble << 4) | low_nibble; 23*81132a39SMatthias Ringwald len++; 24*81132a39SMatthias Ringwald } 25*81132a39SMatthias Ringwald return len; 26*81132a39SMatthias Ringwald } 27*81132a39SMatthias Ringwald 28*81132a39SMatthias Ringwald // CCM Encrypt & Decrypt from Zephyr Project 29*81132a39SMatthias Ringwald 30*81132a39SMatthias Ringwald typedef uint8_t u8_t; 31*81132a39SMatthias Ringwald typedef uint16_t u16_t; 32*81132a39SMatthias Ringwald typedef uint64_t u64_t; 33*81132a39SMatthias Ringwald 34*81132a39SMatthias Ringwald static void sys_put_be16(uint16_t value, uint8_t * buffer) { 35*81132a39SMatthias Ringwald big_endian_store_16(buffer, 0, value); 36*81132a39SMatthias Ringwald } 37*81132a39SMatthias Ringwald static int bt_encrypt_be(const uint8_t * key, const uint8_t * plain, uint8_t * cipher) { 38*81132a39SMatthias Ringwald aes128_calc_cyphertext(key, plain, cipher); 39*81132a39SMatthias Ringwald return 0; 40*81132a39SMatthias Ringwald } 41*81132a39SMatthias Ringwald 42*81132a39SMatthias Ringwald static int bt_mesh_ccm_decrypt(const u8_t key[16], u8_t nonce[13], 43*81132a39SMatthias Ringwald const u8_t *enc_msg, size_t msg_len, 44*81132a39SMatthias Ringwald const u8_t *aad, size_t aad_len, 45*81132a39SMatthias Ringwald u8_t *out_msg, size_t mic_size) 46*81132a39SMatthias Ringwald { 47*81132a39SMatthias Ringwald u8_t msg[16], pmsg[16], cmic[16], cmsg[16], Xn[16], mic[16]; 48*81132a39SMatthias Ringwald u16_t last_blk, blk_cnt; 49*81132a39SMatthias Ringwald size_t i, j; 50*81132a39SMatthias Ringwald int err; 51*81132a39SMatthias Ringwald 52*81132a39SMatthias Ringwald if (msg_len < 1 || aad_len >= 0xff00) { 53*81132a39SMatthias Ringwald return -EINVAL; 54*81132a39SMatthias Ringwald } 55*81132a39SMatthias Ringwald 56*81132a39SMatthias Ringwald /* C_mic = e(AppKey, 0x01 || nonce || 0x0000) */ 57*81132a39SMatthias Ringwald pmsg[0] = 0x01; 58*81132a39SMatthias Ringwald memcpy(pmsg + 1, nonce, 13); 59*81132a39SMatthias Ringwald sys_put_be16(0x0000, pmsg + 14); 60*81132a39SMatthias Ringwald 61*81132a39SMatthias Ringwald err = bt_encrypt_be(key, pmsg, cmic); 62*81132a39SMatthias Ringwald if (err) { 63*81132a39SMatthias Ringwald return err; 64*81132a39SMatthias Ringwald } 65*81132a39SMatthias Ringwald 66*81132a39SMatthias Ringwald /* X_0 = e(AppKey, 0x09 || nonce || length) */ 67*81132a39SMatthias Ringwald if (mic_size == sizeof(u64_t)) { 68*81132a39SMatthias Ringwald pmsg[0] = 0x19 | (aad_len ? 0x40 : 0x00); 69*81132a39SMatthias Ringwald } else { 70*81132a39SMatthias Ringwald pmsg[0] = 0x09 | (aad_len ? 0x40 : 0x00); 71*81132a39SMatthias Ringwald } 72*81132a39SMatthias Ringwald 73*81132a39SMatthias Ringwald memcpy(pmsg + 1, nonce, 13); 74*81132a39SMatthias Ringwald sys_put_be16(msg_len, pmsg + 14); 75*81132a39SMatthias Ringwald 76*81132a39SMatthias Ringwald err = bt_encrypt_be(key, pmsg, Xn); 77*81132a39SMatthias Ringwald if (err) { 78*81132a39SMatthias Ringwald return err; 79*81132a39SMatthias Ringwald } 80*81132a39SMatthias Ringwald 81*81132a39SMatthias Ringwald /* If AAD is being used to authenticate, include it here */ 82*81132a39SMatthias Ringwald if (aad_len) { 83*81132a39SMatthias Ringwald sys_put_be16(aad_len, pmsg); 84*81132a39SMatthias Ringwald 85*81132a39SMatthias Ringwald for (i = 0; i < sizeof(u16_t); i++) { 86*81132a39SMatthias Ringwald pmsg[i] = Xn[i] ^ pmsg[i]; 87*81132a39SMatthias Ringwald } 88*81132a39SMatthias Ringwald 89*81132a39SMatthias Ringwald j = 0; 90*81132a39SMatthias Ringwald aad_len += sizeof(u16_t); 91*81132a39SMatthias Ringwald while (aad_len > 16) { 92*81132a39SMatthias Ringwald do { 93*81132a39SMatthias Ringwald pmsg[i] = Xn[i] ^ aad[j]; 94*81132a39SMatthias Ringwald i++, j++; 95*81132a39SMatthias Ringwald } while (i < 16); 96*81132a39SMatthias Ringwald 97*81132a39SMatthias Ringwald aad_len -= 16; 98*81132a39SMatthias Ringwald i = 0; 99*81132a39SMatthias Ringwald 100*81132a39SMatthias Ringwald err = bt_encrypt_be(key, pmsg, Xn); 101*81132a39SMatthias Ringwald if (err) { 102*81132a39SMatthias Ringwald return err; 103*81132a39SMatthias Ringwald } 104*81132a39SMatthias Ringwald } 105*81132a39SMatthias Ringwald 106*81132a39SMatthias Ringwald for (i = 0; i < aad_len; i++, j++) { 107*81132a39SMatthias Ringwald pmsg[i] = Xn[i] ^ aad[j]; 108*81132a39SMatthias Ringwald } 109*81132a39SMatthias Ringwald 110*81132a39SMatthias Ringwald for (i = aad_len; i < 16; i++) { 111*81132a39SMatthias Ringwald pmsg[i] = Xn[i]; 112*81132a39SMatthias Ringwald } 113*81132a39SMatthias Ringwald 114*81132a39SMatthias Ringwald err = bt_encrypt_be(key, pmsg, Xn); 115*81132a39SMatthias Ringwald if (err) { 116*81132a39SMatthias Ringwald return err; 117*81132a39SMatthias Ringwald } 118*81132a39SMatthias Ringwald } 119*81132a39SMatthias Ringwald 120*81132a39SMatthias Ringwald last_blk = msg_len % 16; 121*81132a39SMatthias Ringwald blk_cnt = (msg_len + 15) / 16; 122*81132a39SMatthias Ringwald if (!last_blk) { 123*81132a39SMatthias Ringwald last_blk = 16; 124*81132a39SMatthias Ringwald } 125*81132a39SMatthias Ringwald 126*81132a39SMatthias Ringwald for (j = 0; j < blk_cnt; j++) { 127*81132a39SMatthias Ringwald if (j + 1 == blk_cnt) { 128*81132a39SMatthias Ringwald /* C_1 = e(AppKey, 0x01 || nonce || 0x0001) */ 129*81132a39SMatthias Ringwald pmsg[0] = 0x01; 130*81132a39SMatthias Ringwald memcpy(pmsg + 1, nonce, 13); 131*81132a39SMatthias Ringwald sys_put_be16(j + 1, pmsg + 14); 132*81132a39SMatthias Ringwald 133*81132a39SMatthias Ringwald err = bt_encrypt_be(key, pmsg, cmsg); 134*81132a39SMatthias Ringwald if (err) { 135*81132a39SMatthias Ringwald return err; 136*81132a39SMatthias Ringwald } 137*81132a39SMatthias Ringwald 138*81132a39SMatthias Ringwald /* Encrypted = Payload[0-15] ^ C_1 */ 139*81132a39SMatthias Ringwald for (i = 0; i < last_blk; i++) { 140*81132a39SMatthias Ringwald msg[i] = enc_msg[(j * 16) + i] ^ cmsg[i]; 141*81132a39SMatthias Ringwald } 142*81132a39SMatthias Ringwald 143*81132a39SMatthias Ringwald memcpy(out_msg + (j * 16), msg, last_blk); 144*81132a39SMatthias Ringwald 145*81132a39SMatthias Ringwald /* X_1 = e(AppKey, X_0 ^ Payload[0-15]) */ 146*81132a39SMatthias Ringwald for (i = 0; i < last_blk; i++) { 147*81132a39SMatthias Ringwald pmsg[i] = Xn[i] ^ msg[i]; 148*81132a39SMatthias Ringwald } 149*81132a39SMatthias Ringwald 150*81132a39SMatthias Ringwald for (i = last_blk; i < 16; i++) { 151*81132a39SMatthias Ringwald pmsg[i] = Xn[i] ^ 0x00; 152*81132a39SMatthias Ringwald } 153*81132a39SMatthias Ringwald 154*81132a39SMatthias Ringwald err = bt_encrypt_be(key, pmsg, Xn); 155*81132a39SMatthias Ringwald if (err) { 156*81132a39SMatthias Ringwald return err; 157*81132a39SMatthias Ringwald } 158*81132a39SMatthias Ringwald 159*81132a39SMatthias Ringwald /* MIC = C_mic ^ X_1 */ 160*81132a39SMatthias Ringwald for (i = 0; i < sizeof(mic); i++) { 161*81132a39SMatthias Ringwald mic[i] = cmic[i] ^ Xn[i]; 162*81132a39SMatthias Ringwald } 163*81132a39SMatthias Ringwald } else { 164*81132a39SMatthias Ringwald /* C_1 = e(AppKey, 0x01 || nonce || 0x0001) */ 165*81132a39SMatthias Ringwald pmsg[0] = 0x01; 166*81132a39SMatthias Ringwald memcpy(pmsg + 1, nonce, 13); 167*81132a39SMatthias Ringwald sys_put_be16(j + 1, pmsg + 14); 168*81132a39SMatthias Ringwald 169*81132a39SMatthias Ringwald err = bt_encrypt_be(key, pmsg, cmsg); 170*81132a39SMatthias Ringwald if (err) { 171*81132a39SMatthias Ringwald return err; 172*81132a39SMatthias Ringwald } 173*81132a39SMatthias Ringwald 174*81132a39SMatthias Ringwald /* Encrypted = Payload[0-15] ^ C_1 */ 175*81132a39SMatthias Ringwald for (i = 0; i < 16; i++) { 176*81132a39SMatthias Ringwald msg[i] = enc_msg[(j * 16) + i] ^ cmsg[i]; 177*81132a39SMatthias Ringwald } 178*81132a39SMatthias Ringwald 179*81132a39SMatthias Ringwald memcpy(out_msg + (j * 16), msg, 16); 180*81132a39SMatthias Ringwald 181*81132a39SMatthias Ringwald /* X_1 = e(AppKey, X_0 ^ Payload[0-15]) */ 182*81132a39SMatthias Ringwald for (i = 0; i < 16; i++) { 183*81132a39SMatthias Ringwald pmsg[i] = Xn[i] ^ msg[i]; 184*81132a39SMatthias Ringwald } 185*81132a39SMatthias Ringwald 186*81132a39SMatthias Ringwald err = bt_encrypt_be(key, pmsg, Xn); 187*81132a39SMatthias Ringwald if (err) { 188*81132a39SMatthias Ringwald return err; 189*81132a39SMatthias Ringwald } 190*81132a39SMatthias Ringwald } 191*81132a39SMatthias Ringwald } 192*81132a39SMatthias Ringwald 193*81132a39SMatthias Ringwald if (memcmp(mic, enc_msg + msg_len, mic_size)) { 194*81132a39SMatthias Ringwald return -EBADMSG; 195*81132a39SMatthias Ringwald } 196*81132a39SMatthias Ringwald 197*81132a39SMatthias Ringwald return 0; 198*81132a39SMatthias Ringwald } 199*81132a39SMatthias Ringwald static int bt_mesh_ccm_encrypt(const u8_t key[16], u8_t nonce[13], 200*81132a39SMatthias Ringwald const u8_t *msg, size_t msg_len, 201*81132a39SMatthias Ringwald const u8_t *aad, size_t aad_len, 202*81132a39SMatthias Ringwald u8_t *out_msg, size_t mic_size) 203*81132a39SMatthias Ringwald { 204*81132a39SMatthias Ringwald u8_t pmsg[16], cmic[16], cmsg[16], mic[16], Xn[16]; 205*81132a39SMatthias Ringwald u16_t blk_cnt, last_blk; 206*81132a39SMatthias Ringwald size_t i, j; 207*81132a39SMatthias Ringwald int err; 208*81132a39SMatthias Ringwald 209*81132a39SMatthias Ringwald // BT_DBG("key %s", bt_hex(key, 16)); 210*81132a39SMatthias Ringwald // BT_DBG("nonce %s", bt_hex(nonce, 13)); 211*81132a39SMatthias Ringwald // BT_DBG("msg (len %zu) %s", msg_len, bt_hex(msg, msg_len)); 212*81132a39SMatthias Ringwald // BT_DBG("aad_len %zu mic_size %zu", aad_len, mic_size); 213*81132a39SMatthias Ringwald 214*81132a39SMatthias Ringwald /* Unsupported AAD size */ 215*81132a39SMatthias Ringwald if (aad_len >= 0xff00) { 216*81132a39SMatthias Ringwald return -EINVAL; 217*81132a39SMatthias Ringwald } 218*81132a39SMatthias Ringwald 219*81132a39SMatthias Ringwald /* C_mic = e(AppKey, 0x01 || nonce || 0x0000) */ 220*81132a39SMatthias Ringwald pmsg[0] = 0x01; 221*81132a39SMatthias Ringwald memcpy(pmsg + 1, nonce, 13); 222*81132a39SMatthias Ringwald sys_put_be16(0x0000, pmsg + 14); 223*81132a39SMatthias Ringwald 224*81132a39SMatthias Ringwald err = bt_encrypt_be(key, pmsg, cmic); 225*81132a39SMatthias Ringwald if (err) { 226*81132a39SMatthias Ringwald return err; 227*81132a39SMatthias Ringwald } 228*81132a39SMatthias Ringwald 229*81132a39SMatthias Ringwald /* X_0 = e(AppKey, 0x09 || nonce || length) */ 230*81132a39SMatthias Ringwald if (mic_size == sizeof(u64_t)) { 231*81132a39SMatthias Ringwald pmsg[0] = 0x19 | (aad_len ? 0x40 : 0x00); 232*81132a39SMatthias Ringwald } else { 233*81132a39SMatthias Ringwald pmsg[0] = 0x09 | (aad_len ? 0x40 : 0x00); 234*81132a39SMatthias Ringwald } 235*81132a39SMatthias Ringwald 236*81132a39SMatthias Ringwald memcpy(pmsg + 1, nonce, 13); 237*81132a39SMatthias Ringwald sys_put_be16(msg_len, pmsg + 14); 238*81132a39SMatthias Ringwald 239*81132a39SMatthias Ringwald err = bt_encrypt_be(key, pmsg, Xn); 240*81132a39SMatthias Ringwald if (err) { 241*81132a39SMatthias Ringwald return err; 242*81132a39SMatthias Ringwald } 243*81132a39SMatthias Ringwald 244*81132a39SMatthias Ringwald /* If AAD is being used to authenticate, include it here */ 245*81132a39SMatthias Ringwald if (aad_len) { 246*81132a39SMatthias Ringwald sys_put_be16(aad_len, pmsg); 247*81132a39SMatthias Ringwald 248*81132a39SMatthias Ringwald for (i = 0; i < sizeof(u16_t); i++) { 249*81132a39SMatthias Ringwald pmsg[i] = Xn[i] ^ pmsg[i]; 250*81132a39SMatthias Ringwald } 251*81132a39SMatthias Ringwald 252*81132a39SMatthias Ringwald j = 0; 253*81132a39SMatthias Ringwald aad_len += sizeof(u16_t); 254*81132a39SMatthias Ringwald while (aad_len > 16) { 255*81132a39SMatthias Ringwald do { 256*81132a39SMatthias Ringwald pmsg[i] = Xn[i] ^ aad[j]; 257*81132a39SMatthias Ringwald i++, j++; 258*81132a39SMatthias Ringwald } while (i < 16); 259*81132a39SMatthias Ringwald 260*81132a39SMatthias Ringwald aad_len -= 16; 261*81132a39SMatthias Ringwald i = 0; 262*81132a39SMatthias Ringwald 263*81132a39SMatthias Ringwald err = bt_encrypt_be(key, pmsg, Xn); 264*81132a39SMatthias Ringwald if (err) { 265*81132a39SMatthias Ringwald return err; 266*81132a39SMatthias Ringwald } 267*81132a39SMatthias Ringwald } 268*81132a39SMatthias Ringwald 269*81132a39SMatthias Ringwald for (i = 0; i < aad_len; i++, j++) { 270*81132a39SMatthias Ringwald pmsg[i] = Xn[i] ^ aad[j]; 271*81132a39SMatthias Ringwald } 272*81132a39SMatthias Ringwald 273*81132a39SMatthias Ringwald for (i = aad_len; i < 16; i++) { 274*81132a39SMatthias Ringwald pmsg[i] = Xn[i]; 275*81132a39SMatthias Ringwald } 276*81132a39SMatthias Ringwald 277*81132a39SMatthias Ringwald err = bt_encrypt_be(key, pmsg, Xn); 278*81132a39SMatthias Ringwald if (err) { 279*81132a39SMatthias Ringwald return err; 280*81132a39SMatthias Ringwald } 281*81132a39SMatthias Ringwald } 282*81132a39SMatthias Ringwald 283*81132a39SMatthias Ringwald last_blk = msg_len % 16; 284*81132a39SMatthias Ringwald blk_cnt = (msg_len + 15) / 16; 285*81132a39SMatthias Ringwald if (!last_blk) { 286*81132a39SMatthias Ringwald last_blk = 16; 287*81132a39SMatthias Ringwald } 288*81132a39SMatthias Ringwald 289*81132a39SMatthias Ringwald for (j = 0; j < blk_cnt; j++) { 290*81132a39SMatthias Ringwald if (j + 1 == blk_cnt) { 291*81132a39SMatthias Ringwald /* X_1 = e(AppKey, X_0 ^ Payload[0-15]) */ 292*81132a39SMatthias Ringwald for (i = 0; i < last_blk; i++) { 293*81132a39SMatthias Ringwald pmsg[i] = Xn[i] ^ msg[(j * 16) + i]; 294*81132a39SMatthias Ringwald } 295*81132a39SMatthias Ringwald for (i = last_blk; i < 16; i++) { 296*81132a39SMatthias Ringwald pmsg[i] = Xn[i] ^ 0x00; 297*81132a39SMatthias Ringwald } 298*81132a39SMatthias Ringwald 299*81132a39SMatthias Ringwald err = bt_encrypt_be(key, pmsg, Xn); 300*81132a39SMatthias Ringwald if (err) { 301*81132a39SMatthias Ringwald return err; 302*81132a39SMatthias Ringwald } 303*81132a39SMatthias Ringwald 304*81132a39SMatthias Ringwald /* MIC = C_mic ^ X_1 */ 305*81132a39SMatthias Ringwald for (i = 0; i < sizeof(mic); i++) { 306*81132a39SMatthias Ringwald mic[i] = cmic[i] ^ Xn[i]; 307*81132a39SMatthias Ringwald } 308*81132a39SMatthias Ringwald 309*81132a39SMatthias Ringwald /* C_1 = e(AppKey, 0x01 || nonce || 0x0001) */ 310*81132a39SMatthias Ringwald pmsg[0] = 0x01; 311*81132a39SMatthias Ringwald memcpy(pmsg + 1, nonce, 13); 312*81132a39SMatthias Ringwald sys_put_be16(j + 1, pmsg + 14); 313*81132a39SMatthias Ringwald 314*81132a39SMatthias Ringwald err = bt_encrypt_be(key, pmsg, cmsg); 315*81132a39SMatthias Ringwald if (err) { 316*81132a39SMatthias Ringwald return err; 317*81132a39SMatthias Ringwald } 318*81132a39SMatthias Ringwald 319*81132a39SMatthias Ringwald /* Encrypted = Payload[0-15] ^ C_1 */ 320*81132a39SMatthias Ringwald for (i = 0; i < last_blk; i++) { 321*81132a39SMatthias Ringwald out_msg[(j * 16) + i] = 322*81132a39SMatthias Ringwald msg[(j * 16) + i] ^ cmsg[i]; 323*81132a39SMatthias Ringwald } 324*81132a39SMatthias Ringwald } else { 325*81132a39SMatthias Ringwald /* X_1 = e(AppKey, X_0 ^ Payload[0-15]) */ 326*81132a39SMatthias Ringwald for (i = 0; i < 16; i++) { 327*81132a39SMatthias Ringwald pmsg[i] = Xn[i] ^ msg[(j * 16) + i]; 328*81132a39SMatthias Ringwald } 329*81132a39SMatthias Ringwald 330*81132a39SMatthias Ringwald err = bt_encrypt_be(key, pmsg, Xn); 331*81132a39SMatthias Ringwald if (err) { 332*81132a39SMatthias Ringwald return err; 333*81132a39SMatthias Ringwald } 334*81132a39SMatthias Ringwald 335*81132a39SMatthias Ringwald /* C_1 = e(AppKey, 0x01 || nonce || 0x0001) */ 336*81132a39SMatthias Ringwald pmsg[0] = 0x01; 337*81132a39SMatthias Ringwald memcpy(pmsg + 1, nonce, 13); 338*81132a39SMatthias Ringwald sys_put_be16(j + 1, pmsg + 14); 339*81132a39SMatthias Ringwald 340*81132a39SMatthias Ringwald err = bt_encrypt_be(key, pmsg, cmsg); 341*81132a39SMatthias Ringwald if (err) { 342*81132a39SMatthias Ringwald return err; 343*81132a39SMatthias Ringwald } 344*81132a39SMatthias Ringwald 345*81132a39SMatthias Ringwald /* Encrypted = Payload[0-15] ^ C_N */ 346*81132a39SMatthias Ringwald for (i = 0; i < 16; i++) { 347*81132a39SMatthias Ringwald out_msg[(j * 16) + i] = 348*81132a39SMatthias Ringwald msg[(j * 16) + i] ^ cmsg[i]; 349*81132a39SMatthias Ringwald } 350*81132a39SMatthias Ringwald 351*81132a39SMatthias Ringwald } 352*81132a39SMatthias Ringwald } 353*81132a39SMatthias Ringwald 354*81132a39SMatthias Ringwald memcpy(out_msg + msg_len, mic, mic_size); 355*81132a39SMatthias Ringwald 356*81132a39SMatthias Ringwald return 0; 357*81132a39SMatthias Ringwald } 358*81132a39SMatthias Ringwald 359*81132a39SMatthias Ringwald static void message_24(void){ 360*81132a39SMatthias Ringwald DEFINE_KEY(encryption_key, "0953fa93e7caac9638f58820220a398e"); 361*81132a39SMatthias Ringwald 362*81132a39SMatthias Ringwald uint8_t network_nonce[13]; 363*81132a39SMatthias Ringwald parse_hex(network_nonce, "000307080d1234000012345677"); 364*81132a39SMatthias Ringwald printf("%16s: ", "network_nonce"); printf_hexdump(network_nonce, 13); 365*81132a39SMatthias Ringwald 366*81132a39SMatthias Ringwald uint8_t plaintext[18]; 367*81132a39SMatthias Ringwald parse_hex(plaintext, "9736e6a03401de1547118463123e5f6a17b9"); 368*81132a39SMatthias Ringwald printf("%16s: ", "plaintext"); printf_hexdump(plaintext, sizeof(plaintext)); 369*81132a39SMatthias Ringwald 370*81132a39SMatthias Ringwald uint8_t ciphertext[18+4]; 371*81132a39SMatthias Ringwald bt_mesh_ccm_encrypt(encryption_key, network_nonce, plaintext, sizeof(plaintext), NULL, 0, ciphertext, 4); 372*81132a39SMatthias Ringwald printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 18); 373*81132a39SMatthias Ringwald printf("%16s: ", "NetMIC"); printf_hexdump(&ciphertext[18], 4); 374*81132a39SMatthias Ringwald } 375*81132a39SMatthias Ringwald 376*81132a39SMatthias Ringwald int main(void){ 377*81132a39SMatthias Ringwald message_24(); 378*81132a39SMatthias Ringwald return 0; 379*81132a39SMatthias Ringwald } 380