aes_ccm.c (f88ad41f77f7f7380cf4f30f10a5f0edb26f8233) aes_ccm.c (13a0a16f72b22f04679f79c5a6b4f0e9de77048e)
1#include <stdio.h>
2#include <stdint.h>
3#include "btstack_util.h"
4#include "aes_cmac.h"
5#include <errno.h>
6#include "aes_ccm.h"
7
8// degbugging

--- 64 unchanged lines hidden (view full) ---

73#endif
74
75 err = bt_encrypt_be(key, pmsg, Xn);
76 if (err) {
77 return err;
78 }
79
80#ifdef LOG_XN
1#include <stdio.h>
2#include <stdint.h>
3#include "btstack_util.h"
4#include "aes_cmac.h"
5#include <errno.h>
6#include "aes_ccm.h"
7
8// degbugging

--- 64 unchanged lines hidden (view full) ---

73#endif
74
75 err = bt_encrypt_be(key, pmsg, Xn);
76 if (err) {
77 return err;
78 }
79
80#ifdef LOG_XN
81 printf("%16s: ", "X1");
81 printf("%16s: ", "Xn");
82 printf_hexdump(Xn, 16);
83#endif
84
85 /* If AAD is being used to authenticate, include it here */
86 if (aad_len) {
87 sys_put_be16(aad_len, pmsg);
88
89 for (i = 0; i < sizeof(u16_t); i++) {

--- 21 unchanged lines hidden (view full) ---

111 pmsg[i] = Xn[i] ^ aad[j];
112 }
113
114 for (i = aad_len; i < 16; i++) {
115 pmsg[i] = Xn[i];
116 }
117
118#ifdef LOG_XN
82 printf_hexdump(Xn, 16);
83#endif
84
85 /* If AAD is being used to authenticate, include it here */
86 if (aad_len) {
87 sys_put_be16(aad_len, pmsg);
88
89 for (i = 0; i < sizeof(u16_t); i++) {

--- 21 unchanged lines hidden (view full) ---

111 pmsg[i] = Xn[i] ^ aad[j];
112 }
113
114 for (i = aad_len; i < 16; i++) {
115 pmsg[i] = Xn[i];
116 }
117
118#ifdef LOG_XN
119 printf("%16s: ", "Xn XOR bn");
120 printf_hexdump(pmsg, 16);
119 printf("%16s: ", "Xn XOR bn");
120 printf_hexdump(pmsg, 16);
121#endif
122
123 err = bt_encrypt_be(key, pmsg, Xn);
124 if (err) {
125 return err;
126 }
127 }
128

--- 27 unchanged lines hidden (view full) ---

156 pmsg[i] = Xn[i] ^ msg[i];
157 }
158
159 for (i = last_blk; i < 16; i++) {
160 pmsg[i] = Xn[i] ^ 0x00;
161 }
162
163#ifdef LOG_XN
121#endif
122
123 err = bt_encrypt_be(key, pmsg, Xn);
124 if (err) {
125 return err;
126 }
127 }
128

--- 27 unchanged lines hidden (view full) ---

156 pmsg[i] = Xn[i] ^ msg[i];
157 }
158
159 for (i = last_blk; i < 16; i++) {
160 pmsg[i] = Xn[i] ^ 0x00;
161 }
162
163#ifdef LOG_XN
164 printf("%16s: ", "Xn XOR bn");
165 printf_hexdump(pmsg, 16);
164 printf("%16s: ", "Xn XOR bn");
165 printf_hexdump(pmsg, 16);
166#endif
167
168 err = bt_encrypt_be(key, pmsg, Xn);
169 if (err) {
170 return err;
171 }
172
173#ifdef LOG_XN
166#endif
167
168 err = bt_encrypt_be(key, pmsg, Xn);
169 if (err) {
170 return err;
171 }
172
173#ifdef LOG_XN
174 printf("%16s: ", "Xn XOR bn");
175 printf_hexdump(pmsg, 16);
174 printf("%16s: ", "Xn XOR bn");
175 printf_hexdump(pmsg, 16);
176#endif
177
178 /* MIC = C_mic ^ X_1 */
179 for (i = 0; i < sizeof(mic); i++) {
180 mic[i] = cmic[i] ^ Xn[i];
181 }
182
183#ifdef LOG_XN
176#endif
177
178 /* MIC = C_mic ^ X_1 */
179 for (i = 0; i < sizeof(mic); i++) {
180 mic[i] = cmic[i] ^ Xn[i];
181 }
182
183#ifdef LOG_XN
184 printf("%16s: ", "mic");
185 printf_hexdump(mic, 16);
184 printf("%16s: ", "mic");
185 printf_hexdump(mic, 16);
186#endif
187
188 } else {
189 /* C_1 = e(AppKey, 0x01 || nonce || 0x0001) */
190 pmsg[0] = 0x01;
191 memcpy(pmsg + 1, nonce, 13);
192 sys_put_be16(j + 1, pmsg + 14);
193
194#ifdef LOG_XN
186#endif
187
188 } else {
189 /* C_1 = e(AppKey, 0x01 || nonce || 0x0001) */
190 pmsg[0] = 0x01;
191 memcpy(pmsg + 1, nonce, 13);
192 sys_put_be16(j + 1, pmsg + 14);
193
194#ifdef LOG_XN
195 printf("%16s: ", "Ai");
196 printf_hexdump(mic, 16);
195 printf("%16s: ", "Ai");
196 printf_hexdump(mic, 16);
197#endif
198
199 err = bt_encrypt_be(key, pmsg, cmsg);
200 if (err) {
201 return err;
202 }
203
204#ifdef LOG_XN
197#endif
198
199 err = bt_encrypt_be(key, pmsg, cmsg);
200 if (err) {
201 return err;
202 }
203
204#ifdef LOG_XN
205 printf("%16s: ", "Si");
206 printf_hexdump(mic, 16);
205 printf("%16s: ", "Si");
206 printf_hexdump(mic, 16);
207#endif
208
209 /* Encrypted = Payload[0-15] ^ C_1 */
210 for (i = 0; i < 16; i++) {
211 msg[i] = enc_msg[(j * 16) + i] ^ cmsg[i];
212 }
213
214 memcpy(out_msg + (j * 16), msg, 16);
215
216#ifdef LOG_XN
207#endif
208
209 /* Encrypted = Payload[0-15] ^ C_1 */
210 for (i = 0; i < 16; i++) {
211 msg[i] = enc_msg[(j * 16) + i] ^ cmsg[i];
212 }
213
214 memcpy(out_msg + (j * 16), msg, 16);
215
216#ifdef LOG_XN
217 printf("%16s: ", "bn");
218 printf_hexdump(msg, 16);
217 printf("%16s: ", "bn");
218 printf_hexdump(msg, 16);
219#endif
220
221 /* X_1 = e(AppKey, X_0 ^ Payload[0-15]) */
222 for (i = 0; i < 16; i++) {
223 pmsg[i] = Xn[i] ^ msg[i];
224 }
225
226 err = bt_encrypt_be(key, pmsg, Xn);
227 if (err) {
228 return err;
229 }
230
231#ifdef LOG_XN
219#endif
220
221 /* X_1 = e(AppKey, X_0 ^ Payload[0-15]) */
222 for (i = 0; i < 16; i++) {
223 pmsg[i] = Xn[i] ^ msg[i];
224 }
225
226 err = bt_encrypt_be(key, pmsg, Xn);
227 if (err) {
228 return err;
229 }
230
231#ifdef LOG_XN
232 printf("%16s: ", "Xn");
233 printf_hexdump(mic, 16);
232 printf("%16s: ", "Xn");
233 printf_hexdump(mic, 16);
234#endif
235
234#endif
235
236
237 }
238 }
239
240 if (memcmp(mic, enc_msg + msg_len, mic_size)) {
241 return -EBADMSG;
242 }
243
244 return 0;

--- 79 unchanged lines hidden (view full) ---

324 pmsg[i] = Xn[i] ^ aad[j];
325 i++, j++;
326 } while (i < 16);
327
328 aad_len -= 16;
329 i = 0;
330
331#ifdef LOG_XN
236 }
237 }
238
239 if (memcmp(mic, enc_msg + msg_len, mic_size)) {
240 return -EBADMSG;
241 }
242
243 return 0;

--- 79 unchanged lines hidden (view full) ---

323 pmsg[i] = Xn[i] ^ aad[j];
324 i++, j++;
325 } while (i < 16);
326
327 aad_len -= 16;
328 i = 0;
329
330#ifdef LOG_XN
332 printf("%16s: ", "Xn XOR bn (aad)");
333 printf_hexdump(pmsg, 16);
331 printf("%16s: ", "Xn XOR bn (aad)");
332 printf_hexdump(pmsg, 16);
334#endif
335
336 err = bt_encrypt_be(key, pmsg, Xn);
337 if (err) {
338 return err;
339 }
340
341#ifdef LOG_XN
333#endif
334
335 err = bt_encrypt_be(key, pmsg, Xn);
336 if (err) {
337 return err;
338 }
339
340#ifdef LOG_XN
342 printf("%16s: ", "Xn+1 AAD");
343 printf_hexdump(Xn, 16);
341 printf("%16s: ", "Xn+1 AAD");
342 printf_hexdump(Xn, 16);
344#endif
345
346 }
347
348 for (i = 0; i < aad_len; i++, j++) {
349 pmsg[i] = Xn[i] ^ aad[j];
350 }
351
352 for (i = aad_len; i < 16; i++) {
353 pmsg[i] = Xn[i];
354 }
355
356#ifdef LOG_XN
343#endif
344
345 }
346
347 for (i = 0; i < aad_len; i++, j++) {
348 pmsg[i] = Xn[i] ^ aad[j];
349 }
350
351 for (i = aad_len; i < 16; i++) {
352 pmsg[i] = Xn[i];
353 }
354
355#ifdef LOG_XN
357 printf("%16s: ", "Xn XOR bn (aad)");
358 printf_hexdump(pmsg, 16);
356 printf("%16s: ", "Xn XOR bn (aad)");
357 printf_hexdump(pmsg, 16);
359#endif
360
361 err = bt_encrypt_be(key, pmsg, Xn);
362 if (err) {
363 return err;
364 }
365#ifdef LOG_XN
358#endif
359
360 err = bt_encrypt_be(key, pmsg, Xn);
361 if (err) {
362 return err;
363 }
364#ifdef LOG_XN
366 printf("%16s: ", "Xn+1 AAD");
367 printf_hexdump(Xn, 16);
365 printf("%16s: ", "Xn+1 AAD");
366 printf_hexdump(Xn, 16);
368#endif
369
370 }
371
372 last_blk = msg_len % 16;
373 blk_cnt = (msg_len + 15) / 16;
374 if (!last_blk) {
375 last_blk = 16;

--- 5 unchanged lines hidden (view full) ---

381 for (i = 0; i < last_blk; i++) {
382 pmsg[i] = Xn[i] ^ msg[(j * 16) + i];
383 }
384 for (i = last_blk; i < 16; i++) {
385 pmsg[i] = Xn[i] ^ 0x00;
386 }
387
388#ifdef LOG_XN
367#endif
368
369 }
370
371 last_blk = msg_len % 16;
372 blk_cnt = (msg_len + 15) / 16;
373 if (!last_blk) {
374 last_blk = 16;

--- 5 unchanged lines hidden (view full) ---

380 for (i = 0; i < last_blk; i++) {
381 pmsg[i] = Xn[i] ^ msg[(j * 16) + i];
382 }
383 for (i = last_blk; i < 16; i++) {
384 pmsg[i] = Xn[i] ^ 0x00;
385 }
386
387#ifdef LOG_XN
389 printf("%16s: ", "Xn XOR Bn");
390 printf_hexdump(pmsg, 16);
388 printf("%16s: ", "Xn XOR Bn");
389 printf_hexdump(pmsg, 16);
391#endif
392
393 err = bt_encrypt_be(key, pmsg, Xn);
394 if (err) {
395 return err;
396 }
397
398#ifdef LOG_XN
390#endif
391
392 err = bt_encrypt_be(key, pmsg, Xn);
393 if (err) {
394 return err;
395 }
396
397#ifdef LOG_XN
399 printf("%16s: ", "Xn+1");
400 printf_hexdump(Xn, 16);
398 printf("%16s: ", "Xn+1");
399 printf_hexdump(Xn, 16);
401#endif
402
403 /* MIC = C_mic ^ X_1 */
404 for (i = 0; i < sizeof(mic); i++) {
405 mic[i] = cmic[i] ^ Xn[i];
406 }
407
408#ifdef LOG_XN
400#endif
401
402 /* MIC = C_mic ^ X_1 */
403 for (i = 0; i < sizeof(mic); i++) {
404 mic[i] = cmic[i] ^ Xn[i];
405 }
406
407#ifdef LOG_XN
409 printf("%16s: ", "mic");
410 printf_hexdump(mic, 16);
408 printf("%16s: ", "mic");
409 printf_hexdump(mic, 16);
411#endif
412
413 /* C_1 = e(AppKey, 0x01 || nonce || 0x0001) */
414 pmsg[0] = 0x01;
415 memcpy(pmsg + 1, nonce, 13);
416 sys_put_be16(j + 1, pmsg + 14);
417
418 err = bt_encrypt_be(key, pmsg, cmsg);

--- 4 unchanged lines hidden (view full) ---

423 /* Encrypted = Payload[0-15] ^ C_1 */
424 for (i = 0; i < last_blk; i++) {
425 out_msg[(j * 16) + i] =
426 msg[(j * 16) + i] ^ cmsg[i];
427 }
428 } else {
429
430#ifdef LOG_XN
410#endif
411
412 /* C_1 = e(AppKey, 0x01 || nonce || 0x0001) */
413 pmsg[0] = 0x01;
414 memcpy(pmsg + 1, nonce, 13);
415 sys_put_be16(j + 1, pmsg + 14);
416
417 err = bt_encrypt_be(key, pmsg, cmsg);

--- 4 unchanged lines hidden (view full) ---

422 /* Encrypted = Payload[0-15] ^ C_1 */
423 for (i = 0; i < last_blk; i++) {
424 out_msg[(j * 16) + i] =
425 msg[(j * 16) + i] ^ cmsg[i];
426 }
427 } else {
428
429#ifdef LOG_XN
431 printf("%16s: ", "bn");
432 printf_hexdump(msg, 16);
430 printf("%16s: ", "bn");
431 printf_hexdump(msg, 16);
433#endif
434
435 /* X_1 = e(AppKey, X_0 ^ Payload[0-15]) */
436 for (i = 0; i < 16; i++) {
437 pmsg[i] = Xn[i] ^ msg[(j * 16) + i];
438 }
439
440#ifdef LOG_XN
432#endif
433
434 /* X_1 = e(AppKey, X_0 ^ Payload[0-15]) */
435 for (i = 0; i < 16; i++) {
436 pmsg[i] = Xn[i] ^ msg[(j * 16) + i];
437 }
438
439#ifdef LOG_XN
441 printf("%16s: ", "Xn XOR Bn");
442 printf_hexdump(pmsg, 16);
440 printf("%16s: ", "Xn XOR Bn");
441 printf_hexdump(pmsg, 16);
443#endif
444
445 err = bt_encrypt_be(key, pmsg, Xn);
446 if (err) {
447 return err;
448 }
449
450#ifdef LOG_XN
442#endif
443
444 err = bt_encrypt_be(key, pmsg, Xn);
445 if (err) {
446 return err;
447 }
448
449#ifdef LOG_XN
451 printf("%16s: ", "Xn+1");
452 printf_hexdump(Xn, 16);
450 printf("%16s: ", "Xn+1");
451 printf_hexdump(Xn, 16);
453#endif
454
455 /* C_1 = e(AppKey, 0x01 || nonce || 0x0001) */
456 pmsg[0] = 0x01;
457 memcpy(pmsg + 1, nonce, 13);
458 sys_put_be16(j + 1, pmsg + 14);
459
460 err = bt_encrypt_be(key, pmsg, cmsg);

--- 17 unchanged lines hidden ---
452#endif
453
454 /* C_1 = e(AppKey, 0x01 || nonce || 0x0001) */
455 pmsg[0] = 0x01;
456 memcpy(pmsg + 1, nonce, 13);
457 sys_put_be16(j + 1, pmsg + 14);
458
459 err = bt_encrypt_be(key, pmsg, cmsg);

--- 17 unchanged lines hidden ---