xref: /btstack/test/crypto/aes_ccm_test.c (revision 81132a391141345b8ee4eac91828c24eeef7ba24)
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