Home | History | Annotate | Download | only in smp

Lines Matching refs:p_cb

66 static bool pts_test_send_authentication_complete_failure(tSMP_CB *p_cb)
70 if (p_cb->cert_failure < 2 || p_cb->cert_failure > 6)
73 SMP_TRACE_ERROR("%s failure case = %d", __func__, p_cb->cert_failure);
75 switch (p_cb->cert_failure)
79 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
83 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
87 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
91 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
95 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
106 static void smp_update_key_mask (tSMP_CB *p_cb, UINT8 key_type, BOOLEAN recv)
109 __func__, p_cb->role, recv, p_cb->local_i_key, p_cb->local_r_key);
111 if (((p_cb->le_secure_connections_mode_is_used) ||
112 (p_cb->smp_over_br)) &&
117 p_cb->local_i_key &= ~key_type;
118 p_cb->local_r_key &= ~key_type;
121 if (p_cb->role == HCI_ROLE_SLAVE)
124 p_cb->local_i_key &= ~key_type;
126 p_cb->local_r_key &= ~key_type;
131 p_cb->local_r_key &= ~key_type;
133 p_cb->local_i_key &= ~key_type;
136 SMP_TRACE_DEBUG("updated local_i_key = %02x, local_r_key = %02x", p_cb->local_i_key,
137 p_cb->local_r_key);
144 void smp_send_app_cback(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
148 SMP_TRACE_DEBUG("%s p_cb->cb_evt=%d", __func__, p_cb->cb_evt);
149 if (p_cb->p_callback && p_cb->cb_evt != 0)
151 switch (p_cb->cb_evt)
154 cb_data.io_req.auth_req = p_cb->peer_auth_req;
158 cb_data.io_req.init_keys = p_cb->local_i_key ;
159 cb_data.io_req.resp_keys = p_cb->local_r_key ;
170 cb_data.loc_oob_data = p_cb->sc_oob_data.loc_oob_data;
186 callback_rc = (*p_cb->p_callback)(p_cb->cb_evt, p_cb->pairing_bda, &cb_data);
188 SMP_TRACE_DEBUG("callback_rc=%d p_cb->cb_evt=%d",callback_rc, p_cb->cb_evt );
192 switch (p_cb->cb_evt)
195 p_cb->loc_auth_req = cb_data.io_req.auth_req;
196 p_cb->local_io_capability = cb_data.io_req.io_cap;
197 p_cb->loc_oob_flag = cb_data.io_req.oob_data;
198 p_cb->loc_enc_size = cb_data.io_req.max_key_size;
199 p_cb->local_i_key = cb_data.io_req.init_keys;
200 p_cb->local_r_key = cb_data.io_req.resp_keys;
202 if (!(p_cb->loc_auth_req & SMP_AUTH_BOND))
205 p_cb->local_i_key = 0;
206 p_cb->local_r_key = 0;
212 p_cb->loc_auth_req, p_cb->local_io_capability, p_cb->loc_oob_flag,
213 p_cb->loc_enc_size, p_cb->local_i_key, p_cb->local_r_key);
215 p_cb->secure_connections_only_mode_required =
218 if (p_cb->secure_connections_only_mode_required)
220 p_cb->loc_auth_req |= SMP_SC_SUPPORT_BIT;
223 if (!(p_cb->loc_auth_req & SMP_SC_SUPPORT_BIT)
224 || lmp_version_below(p_cb->pairing_bda, HCI_PROTO_VERSION_4_2)
226 (const bt_bdaddr_t *)&p_cb->pairing_bda))
228 p_cb->loc_auth_req &= ~SMP_KP_SUPPORT_BIT;
229 p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
230 p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
234 p_cb->loc_auth_req, p_cb->local_i_key, p_cb->local_r_key);
236 smp_sm_event(p_cb, SMP_IO_RSP_EVT, NULL);
240 p_cb->loc_enc_size = cb_data.io_req.max_key_size;
241 p_cb->local_i_key = cb_data.io_req.init_keys;
242 p_cb->local_r_key = cb_data.io_req.resp_keys;
244 p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
245 p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
249 p_cb->loc_enc_size, p_cb->local_i_key, p_cb->local_r_key);
251 smp_br_state_machine_event(p_cb, SMP_BR_KEYS_RSP_EVT, NULL);
257 if (!p_cb->cb_evt && p_cb->discard_sec_req)
259 p_cb->discard_sec_req = FALSE;
260 smp_sm_event(p_cb, SMP_DISCARD_SEC_REQ_EVT, NULL);
270 void smp_send_pair_fail(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
272 p_cb->status = *(UINT8 *)p_data;
273 p_cb->failure = *(UINT8 *)p_data;
275 SMP_TRACE_DEBUG("%s status=%d failure=%d ", __func__, p_cb->status, p_cb->failure);
277 if (p_cb->status <= SMP_MAX_FAIL_RSN_PER_SPEC && p_cb->status != SMP_SUCCESS)
279 smp_send_cmd(SMP_OPCODE_PAIRING_FAILED, p_cb);
280 p_cb->wait_for_authorization_complete = TRUE;
288 void smp_send_pair_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
290 tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (p_cb->pairing_bda);
298 smp_send_cmd(SMP_OPCODE_PAIRING_REQ, p_cb);
305 void smp_send_pair_rsp(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
309 p_cb->local_i_key &= p_cb->peer_i_key;
310 p_cb->local_r_key &= p_cb->peer_r_key;
312 if (smp_send_cmd (SMP_OPCODE_PAIRING_RSP, p_cb))
314 if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB)
315 smp_use_oob_private_key(p_cb, NULL);
317 smp_decide_association_model(p_cb, NULL);
325 void smp_send_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
328 smp_send_cmd(SMP_OPCODE_CONFIRM, p_cb);
335 void smp_send_init(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
338 smp_send_cmd(SMP_OPCODE_INIT, p_cb);
345 void smp_send_rand(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
348 smp_send_cmd(SMP_OPCODE_RAND, p_cb);
355 void smp_send_pair_public_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
358 smp_send_cmd(SMP_OPCODE_PAIR_PUBLIC_KEY, p_cb);
365 void smp_send_commitment(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
368 smp_send_cmd(SMP_OPCODE_PAIR_COMMITM, p_cb);
375 void smp_send_dhkey_check(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
378 smp_send_cmd(SMP_OPCODE_PAIR_DHKEY_CHECK, p_cb);
385 void smp_send_keypress_notification(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
387 p_cb->local_keypress_notification = *(UINT8 *) p_data;
388 smp_send_cmd(SMP_OPCODE_PAIR_KEYPR_NOTIF, p_cb);
395 p_cb, tSMP_INT_DATA *p_data)
399 SMP_TRACE_DEBUG("%s p_cb->loc_enc_size = %d", __func__, p_cb->loc_enc_size);
400 smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ENC, FALSE);
402 smp_send_cmd(SMP_OPCODE_ENCRYPT_INFO, p_cb);
403 smp_send_cmd(SMP_OPCODE_MASTER_ID, p_cb);
406 memcpy(le_key.ltk, p_cb->ltk, BT_OCTET16_LEN);
407 le_key.div = p_cb->div;
408 le_key.key_size = p_cb->loc_enc_size;
409 le_key.sec_level = p_cb->sec_level;
411 if ((p_cb->peer_auth_req & SMP_AUTH_BOND) && (p_cb->loc_auth_req & SMP_AUTH_BOND))
412 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LENC,
417 smp_key_distribution(p_cb, NULL);
424 void smp_send_id_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
428 smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ID, FALSE);
430 smp_send_cmd(SMP_OPCODE_IDENTITY_INFO, p_cb);
431 smp_send_cmd(SMP_OPCODE_ID_ADDR, p_cb);
433 if ((p_cb->peer_auth_req & SMP_AUTH_BOND) && (p_cb->loc_auth_req & SMP_AUTH_BOND))
434 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LID,
438 smp_key_distribution_by_transport(p_cb, NULL);
445 void smp_send_csrk_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
449 smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_CSRK, FALSE);
451 if (smp_send_cmd(SMP_OPCODE_SIGN_INFO, p_cb))
453 key.div = p_cb->div;
454 key.sec_level = p_cb->sec_level;
456 memcpy (key.csrk, p_cb->csrk, BT_OCTET16_LEN);
457 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LCSRK, (tBTM_LE_KEY_VALUE *)&key, TRUE);
460 smp_key_distribution_by_transport(p_cb, NULL);
467 void smp_send_ltk_reply(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
471 btm_ble_ltk_request_reply(p_cb->pairing_bda, TRUE, p_data->key.p_data);
478 void smp_proc_sec_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
486 p_cb->cb_evt = 0;
488 btm_ble_link_sec_check(p_cb->pairing_bda, auth_req, &sec_req_act);
496 smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
500 p_cb->secure_connections_only_mode_required =
504 if (p_cb->secure_connections_only_mode_required &&
508 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
513 p_cb->peer_auth_req = auth_req;
514 p_cb->local_r_key = p_cb->local_i_key = SMP_SEC_DEFAULT_KEY ;
515 p_cb->cb_evt = SMP_SEC_REQUEST_EVT;
520 p_cb->discard_sec_req = TRUE;
533 void smp_proc_sec_grant(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
539 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, p_data);
544 p_cb->cb_evt = SMP_IO_CAP_REQ_EVT;
552 void smp_proc_pair_fail(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
555 p_cb->status = *(UINT8 *)p_data;
562 void smp_proc_pair_cmd(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
566 tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (p_cb->pairing_bda);
570 if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE))
573 p_cb->flags |= SMP_PAIR_FLAG_ENC_AFTER_PAIR;
575 STREAM_TO_UINT8(p_cb->peer_io_caps, p);
576 STREAM_TO_UINT8(p_cb->peer_oob_flag, p);
577 STREAM_TO_UINT8(p_cb->peer_auth_req, p);
578 STREAM_TO_UINT8(p_cb->peer_enc_size, p);
579 STREAM_TO_UINT8(p_cb->peer_i_key, p);
580 STREAM_TO_UINT8(p_cb->peer_r_key, p);
582 if (smp_command_has_invalid_parameters(p_cb))
585 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
590 if (pts_test_send_authentication_complete_failure(p_cb))
593 if (p_cb->role == HCI_ROLE_SLAVE)
595 if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD))
598 p_cb->local_i_key = p_cb->peer_i_key;
599 p_cb->local_r_key = p_cb->peer_r_key;
601 p_cb->cb_evt = SMP_SEC_REQUEST_EVT;
606 p_cb->local_i_key &= p_cb->peer_i_key;
607 p_cb->local_r_key &= p_cb->peer_r_key;
608 p_cb->selected_association_model = smp_select_association_model(p_cb);
610 if (p_cb->secure_connections_only_mode_required &&
611 (!(p_cb->le_secure_connections_mode_is_used) ||
612 (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS)))
617 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
621 if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB)
623 if (smp_request_oob_data(p_cb)) return;
627 smp_send_pair_rsp(p_cb, NULL);
633 p_cb->selected_association_model = smp_select_association_model(p_cb);
635 if (p_cb->secure_connections_only_mode_required &&
636 (!(p_cb->le_secure_connections_mode_is_used) ||
637 (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS)))
642 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
646 if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB)
648 if (smp_request_oob_data(p_cb)) return;
652 smp_decide_association_model(p_cb, NULL);
661 void smp_proc_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
668 if (smp_command_has_invalid_parameters(p_cb))
670 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
677 STREAM_TO_ARRAY(p_cb->rconfirm, p, BT_OCTET16_LEN);
680 p_cb->flags |= SMP_PAIR_FLAGS_CMD_CONFIRM;
687 void smp_proc_init(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
694 if (smp_command_has_invalid_parameters(p_cb))
696 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
701 STREAM_TO_ARRAY(p_cb->rrand, p, BT_OCTET16_LEN);
708 void smp_proc_rand(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
715 if (smp_command_has_invalid_parameters(p_cb))
717 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
722 STREAM_TO_ARRAY(p_cb->rrand, p, BT_OCTET16_LEN);
733 void smp_process_pairing_public_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
740 if (smp_command_has_invalid_parameters(p_cb))
742 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
746 STREAM_TO_ARRAY(p_cb->peer_publ_key.x, p, BT_OCTET32_LEN);
747 STREAM_TO_ARRAY(p_cb->peer_publ_key.y, p, BT_OCTET32_LEN);
748 p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_PUBL_KEY;
750 smp_wait_for_both_public_keys(p_cb, NULL);
757 void smp_process_pairing_commitment(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
764 if (smp_command_has_invalid_parameters(p_cb))
766 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
770 p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_COMM;
774 STREAM_TO_ARRAY(p_cb->remote_commitment, p, BT_OCTET16_LEN);
782 void smp_process_dhkey_check(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
789 if (smp_command_has_invalid_parameters(p_cb))
791 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
797 STREAM_TO_ARRAY(p_cb->remote_dhkey_check, p, BT_OCTET16_LEN);
800 p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_DHK_CHK;
807 void smp_process_keypress_notification(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
813 p_cb->status = *(UINT8 *)p_data;
815 if (smp_command_has_invalid_parameters(p_cb))
817 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
823 STREAM_TO_UINT8(p_cb->peer_keypress_notification, p);
827 p_cb->peer_keypress_notification = BTM_SP_KEY_OUT_OF_RANGE;
829 p_cb->cb_evt = SMP_PEER_KEYPR_NOT_EVT;
837 void smp_br_process_pairing_command(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
841 tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (p_cb->pairing_bda);
845 if (!p_dev_rec->new_encryption_key_is_p256 && p_cb->role == HCI_ROLE_SLAVE)
848 smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason);
853 if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE))
856 p_cb->flags |= SMP_PAIR_FLAG_ENC_AFTER_PAIR;
858 STREAM_TO_UINT8(p_cb->peer_io_caps, p);
859 STREAM_TO_UINT8(p_cb->peer_oob_flag, p);
860 STREAM_TO_UINT8(p_cb->peer_auth_req, p);
861 STREAM_TO_UINT8(p_cb->peer_enc_size, p);
862 STREAM_TO_UINT8(p_cb->peer_i_key, p);
863 STREAM_TO_UINT8(p_cb->peer_r_key, p);
865 if (smp_command_has_invalid_parameters(p_cb))
868 smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason);
874 p_cb->local_i_key = p_cb->peer_i_key;
875 p_cb->local_r_key = p_cb->peer_r_key;
877 if (p_cb->role == HCI_ROLE_SLAVE)
881 p_cb->cb_evt = SMP_BR_KEYS_REQ_EVT;
891 p_cb->peer_auth_req |= SMP_AUTH_BOND;
892 p_cb->loc_auth_req |= SMP_AUTH_BOND;
899 void smp_br_process_security_grant(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
905 smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, p_data);
910 p_cb->cb_evt = SMP_BR_KEYS_REQ_EVT;
919 void smp_br_check_authorization_request(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
924 "(i-initiator r-responder)", __FUNCTION__, p_cb->local_i_key,
925 p_cb->local_r_key);
928 p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
929 p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
933 if (p_cb->role == HCI_ROLE_MASTER)
935 p_cb->local_r_key &= (SMP_SEC_KEY_TYPE_ID | SMP_SEC_KEY_TYPE_CSRK);
939 "(i-initiator r-responder)", __FUNCTION__, p_cb->local_i_key,
940 p_cb->local_r_key);
942 if (/*((p_cb->peer_auth_req & SMP_AUTH_BOND) ||
943 (p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/
944 (p_cb->local_i_key || p_cb->local_r_key))
946 smp_br_state_machine_event(p_cb, SMP_BR_BOND_REQ_EVT, NULL);
949 if (p_cb->role == HCI_ROLE_MASTER && p_cb->local_r_key == 0)
950 smp_key_distribution_by_transport(p_cb, NULL);
954 smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason);
963 void smp_br_select_next_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
967 __func__, p_cb->role, p_cb->local_r_key, p_cb->local_i_key);
969 if (p_cb->role == HCI_ROLE_SLAVE||
970 (!p_cb->local_r_key && p_cb->role == HCI_ROLE_MASTER))
972 smp_key_pick_key(p_cb, p_data);
975 if (!p_cb->local_i_key && !p_cb->local_r_key)
980 if (p_cb->total_tx_unacked == 0)
981 smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason);
983 p_cb->wait_for_authorization_complete = TRUE;
992 void smp_proc_enc_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
997 STREAM_TO_ARRAY(p_cb->ltk, p, BT_OCTET16_LEN);
999 smp_key_distribution(p_cb, NULL);
1005 void smp_proc_master_id(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1011 smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ENC, TRUE);
1017 memcpy(le_key.ltk, p_cb->ltk, BT_OCTET16_LEN);
1018 le_key.sec_level = p_cb->sec_level;
1019 le_key.key_size = p_cb->loc_enc_size;
1021 if ((p_cb->peer_auth_req & SMP_AUTH_BOND) && (p_cb->loc_auth_req & SMP_AUTH_BOND))
1022 btm_sec_save_le_key(p_cb->pairing_bda,
1026 smp_key_distribution(p_cb, NULL);
1033 void smp_proc_id_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1038 STREAM_TO_ARRAY (p_cb->tk, p, BT_OCTET16_LEN); /* reuse TK for IRK */
1039 smp_key_distribution_by_transport(p_cb, NULL);
1046 void smp_proc_id_addr(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1052 smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ID, TRUE);
1056 memcpy(pid_key.irk, p_cb->tk, BT_OCTET16_LEN);
1059 p_cb->id_addr_rcvd = TRUE;
1060 p_cb->id_addr_type = pid_key.addr_type;
1061 memcpy(p_cb->id_addr, pid_key.static_addr, BD_ADDR_LEN);
1064 if ((p_cb->peer_auth_req & SMP_AUTH_BOND) && (p_cb->loc_auth_req & SMP_AUTH_BOND))
1065 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PID,
1067 smp_key_distribution_by_transport(p_cb, NULL);
1074 void smp_proc_srk_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1079 smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_CSRK, TRUE);
1082 le_key.sec_level = p_cb->sec_level;
1086 if ((p_cb->peer_auth_req & SMP_AUTH_BOND) && (p_cb->loc_auth_req & SMP_AUTH_BOND))
1087 btm_sec_save_le_key(p_cb->pairing_bda,
1090 smp_key_distribution_by_transport(p_cb, NULL);
1097 void smp_proc_compare(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1102 if (!memcmp(p_cb->rconfirm, p_data->key.p_data, BT_OCTET16_LEN))
1105 if ( p_cb->peer_enc_size < p_cb->loc_enc_size)
1106 p_cb->loc_enc_size = p_cb->peer_enc_size;
1108 if (p_cb->role == HCI_ROLE_SLAVE)
1109 smp_sm_event(p_cb, SMP_RAND_EVT, NULL);
1113 p_cb->local_i_key = p_cb->peer_i_key;
1114 p_cb->local_r_key = p_cb->peer_r_key;
1116 smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
1122 reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR;
1123 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1131 void smp_proc_sl_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1138 smp_generate_srand_mrand_confirm(p_cb, NULL);
1144 if (p_cb->flags & SMP_PAIR_FLAGS_CMD_CONFIRM)
1145 smp_sm_event(p_cb, SMP_CONFIRM_EVT, NULL);
1153 void smp_start_enc(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1160 cmd = btm_ble_start_encrypt(p_cb->pairing_bda, TRUE, p_data->key.p_data);
1162 cmd = btm_ble_start_encrypt(p_cb->pairing_bda, FALSE, NULL);
1165 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1172 void smp_proc_discard(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1175 if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD))
1176 smp_reset_control_value(p_cb);
1183 void smp_enc_cmpl(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1189 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1196 void smp_check_auth_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1203 __func__, enc_enable, p_cb->local_i_key, p_cb->local_r_key);
1206 if (p_cb->le_secure_connections_mode_is_used)
1209 p_cb->local_i_key |= SMP_SEC_KEY_TYPE_ENC;
1210 p_cb->local_r_key |= SMP_SEC_KEY_TYPE_ENC;
1213 if (!(p_cb->local_i_key & SMP_SEC_KEY_TYPE_LK) ||
1214 !(p_cb->local_r_key & SMP_SEC_KEY_TYPE_LK))
1216 p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
1217 p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
1223 if (p_cb->role == HCI_ROLE_MASTER)
1225 p_cb->local_r_key &= (SMP_SEC_KEY_TYPE_ID | SMP_SEC_KEY_TYPE_CSRK);
1231 p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
1232 p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
1236 __func__, p_cb->local_i_key, p_cb->local_r_key);
1238 if (/*((p_cb->peer_auth_req & SMP_AUTH_BOND) ||
1239 (p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/
1240 (p_cb->local_i_key || p_cb->local_r_key))
1242 smp_sm_event(p_cb, SMP_BOND_REQ_EVT, NULL);
1245 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1250 if (p_cb->flags & SMP_PAIR_FLAG_ENC_AFTER_PAIR)
1251 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1254 else if (p_cb->role == HCI_ROLE_MASTER)
1256 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1265 void smp_key_pick_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1267 UINT8 key_to_dist = (p_cb->role == HCI_ROLE_SLAVE) ? p_cb->local_r_key : p_cb->local_i_key;
1278 (* smp_distribute_act[i])(p_cb, p_data);
1288 void smp_key_distribution(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1292 __func__, p_cb->role, p_cb->local_r_key, p_cb->local_i_key);
1294 if (p_cb->role == HCI_ROLE_SLAVE ||
1295 (!p_cb->local_r_key && p_cb->role == HCI_ROLE_MASTER))
1297 smp_key_pick_key(p_cb, p_data);
1300 if (!p_cb->local_i_key && !p_cb->local_r_key)
1305 if (p_cb->derive_lk)
1307 smp_derive_link_key_from_long_term_key(p_cb, NULL);
1308 p_cb->derive_lk = FALSE;
1311 if (p_cb->total_tx_unacked == 0)
1312 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1314 p_cb->wait_for_authorization_complete = TRUE;
1325 void smp_decide_association_model(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1332 SMP_TRACE_DEBUG("%s Association Model = %d", __func__, p_cb->selected_association_model);
1334 switch (p_cb->selected_association_model)
1337 if (p_cb->role == HCI_ROLE_MASTER &&
1338 ((p_cb->peer_auth_req & SMP_AUTH_YN_BIT) != 0) &&
1339 ((p_cb->loc_auth_req & SMP_AUTH_YN_BIT) == 0))
1348 p_cb->sec_level = SMP_SEC_UNAUTHENTICATE;
1349 SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ", p_cb->sec_level );
1352 key.p_data = p_cb->tk;
1355 memset(p_cb->tk, 0, BT_OCTET16_LEN);
1362 p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1363 SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ", p_cb->sec_level );
1365 p_cb->cb_evt = SMP_PASSKEY_REQ_EVT;
1371 p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1372 SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ", p_cb->sec_level );
1374 p_cb->cb_evt = SMP_OOB_REQ_EVT;
1379 p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1383 smp_generate_passkey(p_cb, NULL);
1402 p_cb->selected_association_model);
1407 SMP_TRACE_EVENT ("sec_level=%d ", p_cb->sec_level );
1409 smp_sm_event(p_cb, int_evt, p);
1416 void smp_process_io_response(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1421 if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)
1425 smp_send_cmd(SMP_OPCODE_SEC_REQ, p_cb);
1430 p_cb->selected_association_model = smp_select_association_model(p_cb);
1432 if (p_cb->secure_connections_only_mode_required &&
1433 (!(p_cb->le_secure_connections_mode_is_used) ||
1434 (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS)))
1438 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1442 if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB)
1444 if (smp_request_oob_data(p_cb)) return;
1448 if (pts_test_send_authentication_complete_failure(p_cb))
1451 smp_send_pair_rsp(p_cb, NULL);
1460 void smp_br_process_slave_keys_response(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1462 smp_br_send_pair_response(p_cb, NULL);
1469 void smp_br_send_pair_response(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1473 p_cb->local_i_key &= p_cb->peer_i_key;
1474 p_cb->local_r_key &= p_cb->peer_r_key;
1476 smp_send_cmd (SMP_OPCODE_PAIRING_RSP, p_cb);
1484 void smp_pairing_cmpl(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1486 if (p_cb->total_tx_unacked == 0)
1489 L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, TRUE);
1491 smp_proc_pairing_cmpl(p_cb);
1500 void smp_pair_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1503 p_cb->status = SMP_CONN_TOUT;
1504 smp_proc_pairing_cmpl(p_cb);
1512 void smp_idle_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1514 if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)
1517 p_cb->status = SMP_FAIL;
1518 smp_proc_pairing_cmpl(p_cb);
1526 void smp_fast_conn_param(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1529 L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, FALSE);
1541 void smp_both_have_public_keys(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1546 smp_compute_dhkey(p_cb);
1549 if (p_cb->role == HCI_ROLE_SLAVE)
1550 smp_send_pair_public_key(p_cb, NULL);
1552 smp_sm_event(p_cb, SMP_SC_DHKEY_CMPLT_EVT, NULL);
1561 void smp_start_secure_connection_phase1(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1565 if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS)
1567 p_cb->sec_level = SMP_SEC_UNAUTHENTICATE;
1568 SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ", p_cb->sec_level );
1572 p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1573 SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ", p_cb->sec_level );
1576 switch(p_cb->selected_association_model)
1580 memset(p_cb->local_random, 0, BT_OCTET16_LEN);
1581 smp_start_nonce_generation(p_cb);
1585 p_cb->cb_evt = SMP_PASSKEY_REQ_EVT;
1586 smp_sm_event(p_cb, SMP_TK_REQ_EVT, NULL);
1591 smp_generate_passkey(p_cb, NULL);
1595 smp_process_secure_connection_oob_data(p_cb, NULL);
1599 p_cb->selected_association_model);
1610 void smp_process_local_nonce(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1614 switch(p_cb->selected_association_model)
1618 if (p_cb->role == HCI_ROLE_SLAVE)
1621 smp_calculate_local_commitment(p_cb);
1622 smp_send_commitment(p_cb, NULL);
1628 if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM)
1633 p_cb->selected_association_model);
1634 p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM;
1635 smp_send_rand(p_cb, NULL);
1642 smp_calculate_local_commitment(p_cb);
1644 if (p_cb->role == HCI_ROLE_MASTER)
1646 smp_send_commitment(p_cb, NULL);
1650 if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM)
1653 smp_send_commitment(p_cb, NULL);
1659 if (p_cb->role == HCI_ROLE_MASTER)
1661 smp_send_rand(p_cb, NULL);
1668 p_cb->selected_association_model);
1680 void smp_process_peer_nonce(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1687 if (p_cb->cert_failure == 1) {
1688 SMP_TRACE_ERROR("%s failure case = %d", __func__, p_cb->cert_failure);
1689 reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR;
1690 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1694 switch(p_cb->selected_association_model)
1699 if (p_cb->role == HCI_ROLE_MASTER)
1701 if (!smp_check_commitment(p_cb))
1703 reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR;
1704 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1711 smp_send_rand(p_cb, NULL);
1714 if(p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS)
1717 smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1722 smp_sm_event(p_cb, SMP_SC_CALC_NC_EVT, NULL);
1727 if (!smp_check_commitment(p_cb) && p_cb
1729 reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR;
1730 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1734 if (p_cb->role == HCI_ROLE_SLAVE)
1736 smp_send_rand(p_cb, NULL);
1739 if (++p_cb->round < 20)
1742 p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM;
1743 smp_start_nonce_generation(p_cb);
1747 smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1750 if (p_cb->role == HCI_ROLE_SLAVE)
1752 smp_send_rand(p_cb, NULL);
1755 smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1759 p_cb->selected_association_model);
1771 void smp_match_dhkey_checks(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1777 if (memcmp(p_data->key.p_data, p_cb->remote_dhkey_check, BT_OCTET16_LEN))
1780 p_cb->failure = reason;
1781 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1788 if (p_cb->peer_enc_size < p_cb->loc_enc_size)
1789 p_cb->loc_enc_size = p_cb->peer_enc_size;
1791 if (p_cb->role == HCI_ROLE_SLAVE)
1793 smp_sm_event(p_cb, SMP_PAIR_DHKEY_CHCK_EVT, NULL);
1798 p_cb->local_i_key = p_cb->peer_i_key;
1799 p_cb->local_r_key = p_cb->peer_r_key;
1800 smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
1811 void smp_move_to_secure_connections_phase2(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1814 smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1824 void smp_phase_2_dhkey_checks_are_present(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1828 if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_DHK_CHK)
1829 smp_sm_event(p_cb, SMP_SC_2_DHCK_CHKS_PRES_EVT, NULL);
1840 void smp_wait_for_both_public_keys(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1844 if ((p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_PUBL_KEY) &&
1845 (p_cb->flags & SMP_PAIR_FLAG_HAVE_LOCAL_PUBL_KEY))
1847 if ((p_cb->role == HCI_ROLE_SLAVE) &&
1848 ((p_cb->req_oob_type == SMP_OOB_LOCAL) || (p_cb->req_oob_type == SMP_OOB_BOTH)))
1852 smp_sm_event(p_cb, SMP_BOTH_PUBL_KEYS_RCVD_EVT, NULL);
1860 void smp_start_passkey_verification(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1865 p = p_cb->local_random;
1868 p = p_cb->peer_random;
1871 p_cb->round = 0;
1872 smp_start_nonce_generation(p_cb);
1879 void smp_process_secure_connection_oob_data(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1883 tSMP_SC_OOB_DATA *p_sc_oob_data = &p_cb->sc_oob_data;
1886 memcpy(p_cb->local_random, p_sc_oob_data->loc_oob_data.randomizer,
1887 sizeof(p_cb->local_random));
1892 memset(p_cb->local_random, 0, sizeof (p_cb->local_random));
1898 memset(p_cb->peer_random, 0, sizeof (p_cb->peer_random));
1902 memcpy(p_cb->peer_random, p_sc_oob_data->peer_oob_data.randomizer,
1903 sizeof(p_cb->peer_random));
1904 memcpy(p_cb->remote_commitment, p_sc_oob_data->peer_oob_data.commitment,
1905 sizeof(p_cb->remote_commitment));
1909 if (!smp_check_commitment(p_cb))
1911 p_cb->failure = reason;
1912 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1916 if (p_cb->peer_oob_flag != SMP_OOB_PRESENT)
1920 memset(p_cb->local_random, 0, sizeof (p_cb->local_random));
1924 print128(p_cb->local_random, (const UINT8 *)"local OOB randomizer");
1925 print128(p_cb->peer_random, (const UINT8 *)"peer OOB randomizer");
1926 smp_start_nonce_generation(p_cb);
1935 void smp_set_local_oob_keys(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1939 memcpy(p_cb->sc_oob_data.loc_oob_data.private_key_used, p_cb->private_key,
1941 p_cb->sc_oob_data.loc_oob_data.publ_key_used = p_cb->loc_publ_key;
1942 smp_start_nonce_generation(p_cb);
1950 void smp_set_local_oob_random_commitment(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1953 memcpy(p_cb->sc_oob_data.loc_oob_data.randomizer, p_cb->rand,
1956 smp_calculate_f4(p_cb->sc_oob_data.loc_oob_data.publ_key_used.x,
1957 p_cb->sc_oob_data.loc_oob_data.publ_key_used.x,
1958 p_cb->sc_oob_data.loc_oob_data.randomizer, 0,
1959 p_cb->sc_oob_data.loc_oob_data.commitment);
1964 p_print = (UINT8*) &p_cb->sc_oob_data.loc_oob_data.addr_sent_to;
1967 p_print = (UINT8*) &p_cb->sc_oob_data.loc_oob_data.private_key_used;
1970 p_print = (UINT8*) &p_cb->sc_oob_data.loc_oob_data.publ_key_used.x;
1973 p_print = (UINT8*) &p_cb->sc_oob_data.loc_oob_data.publ_key_used.y;
1976 p_print = (UINT8*) &p_cb->sc_oob_data.loc_oob_data.randomizer;
1979 p_print = (UINT8*) &p_cb->sc_oob_data.loc_oob_data.commitment;
1986 p_cb->cb_evt = SMP_SC_LOC_OOB_DATA_UP_EVT;
1987 smp_send_app_cback(p_cb, NULL);
1989 smp_cb_cleanup(p_cb);
2006 tSMP_CB *p_cb = &smp_cb;
2014 if (p_cb->loc_enc_size != 0 && encr_enable)
2017 btm_ble_update_sec_key_size(bda, p_cb->loc_enc_size);
2075 tSMP_CB *p_cb = &smp_cb;
2078 smp_save_secure_connections_long_term_key(p_cb);
2080 smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ENC, FALSE);
2081 smp_key_distribution(p_cb, NULL);
2095 void smp_set_derive_link_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
2098 p_cb->derive_lk = TRUE;
2099 smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_LK, FALSE);
2100 smp_key_distribution(p_cb, NULL);
2112 void smp_derive_link_key_from_long_term_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
2117 if (!smp_calculate_link_key_from_long_term_key(p_cb))
2120 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
2136 void smp_br_process_link_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
2141 if (!smp_calculate_long_term_key_from_link_key(p_cb))
2144 smp_sm_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &status);
2149 smp_save_secure_connections_long_term_key(p_cb);
2150 smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ENC, FALSE);
2151 smp_br_select_next_key(p_cb, NULL);
2159 void smp_key_distribution_by_transport(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
2162 if (p_cb->smp_over_br)
2164 smp_br_select_next_key(p_cb, NULL);
2168 smp_key_distribution(p_cb, NULL);
2177 void smp_br_pairing_complete(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
2181 if (p_cb->total_tx_unacked == 0)
2184 smp_proc_pairing_cmpl(p_cb);