Lines Matching full:p_cb
48 static void smp_process_stk(tSMP_CB* p_cb, tSMP_ENC* p);
49 static bool smp_calculate_legacy_short_term_key(tSMP_CB* p_cb,
51 static void smp_process_private_key(tSMP_CB* p_cb);
173 void smp_proc_passkey(tSMP_CB* p_cb, BT_OCTET8 rand) {
174 uint8_t* tt = p_cb->tk;
187 memset(p_cb->tk, 0, BT_OCTET16_LEN);
191 key.p_data = p_cb->tk;
193 if (p_cb->p_callback) {
194 (*p_cb->p_callback)(SMP_PASSKEY_NOTIF_EVT, p_cb->pairing_bda,
198 if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_PASSKEY_DISP) {
201 smp_sm_event(p_cb, SMP_KEY_READY_EVT, (tSMP_INT_DATA*)&key);
214 void smp_generate_passkey(tSMP_CB* p_cb, UNUSED_ATTR tSMP_INT_DATA* p_data) {
217 btsnd_hcic_ble_rand(Bind(&smp_proc_passkey, p_cb));
231 void smp_generate_stk(tSMP_CB* p_cb, UNUSED_ATTR tSMP_INT_DATA* p_data) {
237 if (p_cb->le_secure_connections_mode_is_used) {
242 memcpy(output.param_buf, p_cb->ltk, SMP_ENCRYT_DATA_SIZE);
243 } else if (!smp_calculate_legacy_short_term_key(p_cb, &output)) {
245 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
249 smp_process_stk(p_cb, &output);
255 void smp_compute_csrk(uint16_t div, tSMP_CB* p_cb) {
263 p_cb->div = div;
265 SMP_TRACE_DEBUG("%s: div=%x", __func__, p_cb->div);
268 UINT16_TO_STREAM(p, p_cb->div);
273 if (p_cb->smp_over_br) {
274 smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &status);
276 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
279 memcpy((void*)p_cb->csrk, output.param_buf, BT_OCTET16_LEN);
280 smp_send_csrk_info(p_cb, NULL);
287 void smp_generate_csrk(tSMP_CB* p_cb, UNUSED_ATTR tSMP_INT_DATA* p_data) {
292 div_status = btm_get_local_div(p_cb->pairing_bda, &p_cb->div);
294 smp_compute_csrk(p_cb->div, p_cb);
298 [](tSMP_CB* p_cb, BT_OCTET8 rand) {
301 smp_compute_csrk(div, p_cb);
303 p_cb));
311 void smp_concatenate_local(tSMP_CB* p_cb, uint8_t** p_data, uint8_t op_code) {
316 UINT8_TO_STREAM(p, p_cb->local_io_capability);
317 UINT8_TO_STREAM(p, p_cb->loc_oob_flag);
318 UINT8_TO_STREAM(p, p_cb->loc_auth_req);
319 UINT8_TO_STREAM(p, p_cb->loc_enc_size);
320 UINT8_TO_STREAM(p, p_cb->local_i_key);
321 UINT8_TO_STREAM(p, p_cb->local_r_key);
330 void smp_concatenate_peer(tSMP_CB* p_cb, uint8_t** p_data, uint8_t op_code) {
335 UINT8_TO_STREAM(p, p_cb->peer_io_caps);
336 UINT8_TO_STREAM(p, p_cb->peer_oob_flag);
337 UINT8_TO_STREAM(p, p_cb->peer_auth_req);
338 UINT8_TO_STREAM(p, p_cb->peer_enc_size);
339 UINT8_TO_STREAM(p, p_cb->peer_i_key);
340 UINT8_TO_STREAM(p, p_cb->peer_r_key);
357 void smp_gen_p1_4_confirm(tSMP_CB* p_cb, tBLE_ADDR_TYPE remote_bd_addr_type,
361 if (p_cb->role == HCI_ROLE_MASTER) {
363 UINT8_TO_STREAM(p, p_cb->addr_type);
367 smp_concatenate_local(p_cb, &p, SMP_OPCODE_PAIRING_REQ);
369 smp_concatenate_peer(p_cb, &p, SMP_OPCODE_PAIRING_RSP);
374 UINT8_TO_STREAM(p, p_cb->addr_type);
376 smp_concatenate_peer(p_cb, &p, SMP_OPCODE_PAIRING_REQ);
378 smp_concatenate_local(p_cb, &p, SMP_OPCODE_PAIRING_RSP);
396 void smp_gen_p2_4_confirm(tSMP_CB* p_cb, const RawAddress& remote_bda,
402 if (p_cb->role == HCI_ROLE_MASTER) {
406 BDADDR_TO_STREAM(p, p_cb->local_bda);
409 BDADDR_TO_STREAM(p, p_cb->local_bda);
425 tSMP_STATUS smp_calculate_comfirm(tSMP_CB* p_cb, BT_OCTET16 rand,
431 if (!BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, remote_bda,
437 BTM_ReadConnectionAddr(p_cb->pairing_bda, p_cb->local_bda, &p_cb->addr_type);
440 smp_gen_p1_4_confirm(p_cb, remote_bd_addr_type, p1);
445 smp_debug_print_nbyte_little_endian(p_cb->tk, "TK", 16);
447 if (!SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, p1, BT_OCTET16_LEN, output)) {
454 smp_gen_p2_4_confirm(p_cb, remote_bda, p2);
460 if (!SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, p2, BT_OCTET16_LEN, output)) {
478 static void smp_generate_confirm(tSMP_CB* p_cb) {
480 smp_debug_print_nbyte_little_endian((uint8_t*)p_cb->rand, "local_rand", 16);
482 tSMP_STATUS status = smp_calculate_comfirm(p_cb, p_cb->rand, &output);
484 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
488 memcpy(p_cb->confirm, output.param_buf, BT_OCTET16_LEN);
489 smp_debug_print_nbyte_little_endian(p_cb->confirm, "Local Confirm generated",
493 smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key);
507 void smp_generate_srand_mrand_confirm(tSMP_CB* p_cb,
512 [](tSMP_CB* p_cb, BT_OCTET8 rand) {
513 memcpy((void*)p_cb->rand, rand, 8);
517 [](tSMP_CB* p_cb, BT_OCTET8 rand) {
518 memcpy((void*)&p_cb->rand[8], rand, BT_OCTET8_LEN);
519 smp_generate_confirm(p_cb);
521 p_cb));
523 p_cb));
538 void smp_generate_compare(tSMP_CB* p_cb, UNUSED_ATTR tSMP_INT_DATA* p_data) {
540 smp_debug_print_nbyte_little_endian((uint8_t*)p_cb->rrand, "peer rand", 16);
542 tSMP_STATUS status = smp_calculate_comfirm(p_cb, p_cb->rrand, &output);
544 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
552 smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key);
565 static void smp_process_stk(tSMP_CB* p_cb, tSMP_ENC* p) {
572 smp_mask_enc_key(p_cb->loc_enc_size, p->param_buf);
577 smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key);
583 static void smp_process_ediv(tSMP_CB* p_cb, tSMP_ENC* p) {
592 p_cb->ediv = p_cb->div ^ y;
598 smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key);
604 static void smp_generate_y(tSMP_CB* p_cb, BT_OCTET8 rand) {
610 memcpy(p_cb->enc_rand, rand, BT_OCTET8_LEN);
615 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
617 smp_process_ediv(p_cb, &output);
624 static void smp_generate_ltk_cont(uint16_t div, tSMP_CB* p_cb) {
625 p_cb->div = div;
633 if (!SMP_Encrypt(er, BT_OCTET16_LEN, (uint8_t*)&p_cb->div, sizeof(uint16_t),
637 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
640 smp_mask_enc_key(p_cb->loc_enc_size, output.param_buf);
641 memcpy((void*)p_cb->ltk, output.param_buf, BT_OCTET16_LEN);
644 btsnd_hcic_ble_rand(Bind(&smp_generate_y, p_cb));
663 void smp_generate_ltk(tSMP_CB* p_cb, UNUSED_ATTR tSMP_INT_DATA* p_data) {
667 smp_br_process_link_key(p_cb, NULL);
669 } else if (p_cb->le_secure_connections_mode_is_used) {
674 bool div_status = btm_get_local_div(p_cb->pairing_bda, &p_cb->div);
677 smp_generate_ltk_cont(p_cb->div, p_cb);
683 [](tSMP_CB* p_cb, BT_OCTET8 rand) {
686 smp_generate_ltk_cont(div, p_cb);
688 p_cb));
701 bool smp_calculate_legacy_short_term_key(tSMP_CB* p_cb, tSMP_ENC* output) {
707 if (p_cb->role == HCI_ROLE_MASTER) {
708 memcpy(p, p_cb->rand, BT_OCTET8_LEN);
709 memcpy(&p[BT_OCTET8_LEN], p_cb->rrand, BT_OCTET8_LEN);
711 memcpy(p, p_cb->rrand, BT_OCTET8_LEN);
712 memcpy(&p[BT_OCTET8_LEN], p_cb->rand, BT_OCTET8_LEN);
717 SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, ptext, BT_OCTET16_LEN, output);
736 void smp_create_private_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
740 [](tSMP_CB* p_cb, BT_OCTET8 rand) {
741 memcpy((void*)p_cb->private_key, rand, BT_OCTET8_LEN);
743 [](tSMP_CB* p_cb, BT_OCTET8 rand) {
744 memcpy((void*)&p_cb->private_key[8], rand, BT_OCTET8_LEN);
746 [](tSMP_CB* p_cb, BT_OCTET8 rand) {
747 memcpy((void*)&p_cb->private_key[16], rand, BT_OCTET8_LEN);
749 [](tSMP_CB* p_cb, BT_OCTET8 rand) {
750 memcpy((void*)&p_cb->private_key[24], rand,
752 smp_process_private_key(p_cb);
754 p_cb));
756 p_cb));
758 p_cb));
760 p_cb));
779 void smp_use_oob_private_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
780 SMP_TRACE_DEBUG("%s req_oob_type: %d, role: %d", __func__, p_cb->req_oob_type,
781 p_cb->role);
783 switch (p_cb->req_oob_type) {
787 memcpy(p_cb->private_key, p_cb->sc_oob_data.loc_oob_data.private_key_used,
789 smp_process_private_key(p_cb);
794 smp_decide_association_model(p_cb, NULL);
810 void smp_process_private_key(tSMP_CB* p_cb) {
816 memcpy(private_key, p_cb->private_key, BT_OCTET32_LEN);
819 memcpy(p_cb->loc_publ_key.x, public_key.x, BT_OCTET32_LEN);
820 memcpy(p_cb->loc_publ_key.y, public_key.y, BT_OCTET32_LEN);
822 smp_debug_print_nbyte_little_endian(p_cb->private_key, "private",
824 smp_debug_print_nbyte_little_endian(p_cb->loc_publ_key.x, "local public(x)",
826 smp_debug_print_nbyte_little_endian(p_cb->loc_publ_key.y, "local public(y)",
828 p_cb->flags |= SMP_PAIR_FLAG_HAVE_LOCAL_PUBL_KEY;
829 smp_sm_event(p_cb, SMP_LOC_PUBL_KEY_CRTD_EVT, NULL);
844 void smp_compute_dhkey(tSMP_CB* p_cb) {
850 memcpy(private_key, p_cb->private_key, BT_OCTET32_LEN);
851 memcpy(peer_publ_key.x, p_cb->peer_publ_key.x, BT_OCTET32_LEN);
852 memcpy(peer_publ_key.y, p_cb->peer_publ_key.y, BT_OCTET32_LEN);
857 memcpy(p_cb->dhkey, new_publ_key.x, BT_OCTET32_LEN);
859 smp_debug_print_nbyte_little_endian(p_cb->dhkey, "Old DHKey", BT_OCTET32_LEN);
861 smp_debug_print_nbyte_little_endian(p_cb->private_key, "private",
863 smp_debug_print_nbyte_little_endian(p_cb->peer_publ_key.x, "rem public(x)",
865 smp_debug_print_nbyte_little_endian(p_cb->peer_publ_key.y, "rem public(y)",
867 smp_debug_print_nbyte_little_endian(p_cb->dhkey, "Reverted DHKey",
880 void smp_calculate_local_commitment(tSMP_CB* p_cb) {
885 switch (p_cb->selected_association_model) {
888 if (p_cb->role == HCI_ROLE_MASTER)
892 smp_calculate_f4(p_cb->loc_publ_key.x, p_cb->peer_publ_key.x, p_cb->rand,
893 0, p_cb->commitment);
898 smp_calculate_random_input(p_cb->local_random, p_cb->round);
899 smp_calculate_f4(p_cb->loc_publ_key.x, p_cb->peer_publ_key.x, p_cb->rand,
900 random_input, p_cb->commitment);
905 smp_calculate_f4(p_cb->loc_publ_key.x, p_cb->loc_publ_key.x,
906 p_cb->local_random, 0, p_cb->commitment);
910 p_cb->selected_association_model);
927 void smp_calculate_peer_commitment(tSMP_CB* p_cb, BT_OCTET16 output_buf) {
932 switch (p_cb->selected_association_model) {
935 if (p_cb->role == HCI_ROLE_SLAVE)
939 smp_calculate_f4(p_cb->peer_publ_key.x, p_cb->loc_publ_key.x, p_cb->rrand,
944 ri = smp_calculate_random_input(p_cb->peer_random, p_cb->round);
945 smp_calculate_f4(p_cb->peer_publ_key.x, p_cb->loc_publ_key.x, p_cb->rrand,
949 smp_calculate_f4(p_cb->peer_publ_key.x, p_cb->peer_publ_key.x,
950 p_cb->peer_random, 0, output_buf);
954 p_cb->selected_association_model);
1042 void smp_calculate_numeric_comparison_display_number(tSMP_CB* p_cb,
1046 if (p_cb->role == HCI_ROLE_MASTER) {
1047 p_cb->number_to_display = smp_calculate_g2(
1048 p_cb->loc_publ_key.x, p_cb->peer_publ_key.x, p_cb->rand, p_cb->rrand);
1050 p_cb->number_to_display = smp_calculate_g2(
1051 p_cb->peer_publ_key.x, p_cb->loc_publ_key.x, p_cb->rrand, p_cb->rand);
1054 if (p_cb->number_to_display >= (BTM_MAX_PASSKEY_VAL + 1)) {
1056 reason = p_cb->failure = SMP_PAIR_FAIL_UNKNOWN;
1057 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1062 p_cb->number_to_display);
1063 p_cb->cb_evt = SMP_NC_REQ_EVT;
1064 smp_sm_event(p_cb, SMP_SC_DSPL_NC_EVT, &p_cb->number_to_display);
1475 void smp_calculate_local_dhkey_check(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1480 smp_calculate_f5_mackey_and_long_term_key(p_cb);
1482 smp_collect_local_io_capabilities(iocap, p_cb);
1484 smp_collect_local_ble_address(a, p_cb);
1485 smp_collect_peer_ble_address(b, p_cb);
1486 smp_calculate_f6(p_cb->mac_key, p_cb->rand, p_cb->rrand, p_cb->peer_random,
1487 iocap, a, b, p_cb->dhkey_check);
1501 void smp_calculate_peer_dhkey_check(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1510 smp_collect_peer_io_capabilities(iocap, p_cb);
1512 smp_collect_local_ble_address(a, p_cb);
1513 smp_collect_peer_ble_address(b, p_cb);
1514 ret = smp_calculate_f6(p_cb->mac_key, p_cb->rrand, p_cb->rand,
1515 p_cb->local_random, iocap, b, a, param_buf);
1525 smp_sm_event(p_cb, SMP_SC_KEY_READY_EVT, &key);
1528 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
1634 bool smp_calculate_link_key_from_long_term_key(tSMP_CB* p_cb) {
1643 if (p_cb->id_addr_rcvd && p_cb->id_addr_type == BLE_ADDR_PUBLIC) {
1646 bda_for_lk = p_cb->id_addr;
1647 } else if ((BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, bda_for_lk,
1656 p_dev_rec = btm_find_dev(p_cb->pairing_bda);
1665 if (p_cb->key_derivation_h7_used)
1666 ret = smp_calculate_h7((uint8_t*)salt, p_cb->ltk, intermediate_link_key);
1668 ret = smp_calculate_h6(p_cb->ltk, (uint8_t*)"1pmt" /* reversed "tmp1" */,
1687 if (p_cb->sec_level == SMP_SEC_AUTHENTICATED)
1693 if (p_cb->sec_level == SMP_SEC_AUTHENTICATED)
1729 bool smp_calculate_long_term_key_from_link_key(tSMP_CB* p_cb) {
1738 p_dev_rec = btm_find_dev(p_cb->pairing_bda);
1745 br_link_key_type = BTM_SecGetDeviceLinkKeyType(p_cb->pairing_bda);
1765 if (p_cb->key_derivation_h7_used) {
1781 (uint8_t*)"elrb" /* reversed "brle" */, p_cb->ltk);
1786 p_cb->sec_level = (br_link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256)
1910 void smp_start_nonce_generation(tSMP_CB* p_cb) {
1913 [](tSMP_CB* p_cb, BT_OCTET8 rand) {
1914 memcpy((void*)p_cb->rand, rand, BT_OCTET8_LEN);
1916 [](tSMP_CB* p_cb, BT_OCTET8 rand) {
1917 memcpy((void*)&p_cb->rand[8], rand, BT_OCTET8_LEN);
1918 SMP_TRACE_DEBUG("%s round %d", __func__, p_cb->round);
1920 smp_sm_event(p_cb, SMP_HAVE_LOC_NONCE_EVT, NULL);
1922 p_cb));
1924 p_cb));