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 --- |