Home | History | Annotate | Download | only in smp

Lines Matching full:p_cb

57 static void smp_update_key_mask (tSMP_CB *p_cb, UINT8 key_type, BOOLEAN recv)
60 SMP_TRACE_DEBUG4("before update role=%d recv=%d loc_i_key = %02x, loc_r_key = %02x", p_cb->role, recv, p_cb->loc_i_key, p_cb->loc_r_key);
61 if (p_cb->role == HCI_ROLE_SLAVE)
64 p_cb->loc_i_key &= ~key_type;
66 p_cb->loc_r_key &= ~key_type;
71 p_cb->loc_r_key &= ~key_type;
73 p_cb->loc_i_key &= ~key_type;
76 SMP_TRACE_DEBUG2("updated loc_i_key = %02x, loc_r_key = %02x", p_cb->loc_i_key, p_cb->loc_r_key);
82 void smp_send_app_cback(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
86 SMP_TRACE_DEBUG1 ("smp_send_app_cback p_cb->cb_evt=%d", p_cb->cb_evt );
87 if (p_cb->p_callback && p_cb->cb_evt != 0)
89 if (p_cb->cb_evt == SMP_IO_CAP_REQ_EVT)
91 cb_data.io_req.auth_req = p_cb->peer_auth_req;
95 cb_data.io_req.init_keys = p_cb->loc_i_key ;
96 cb_data.io_req.resp_keys = p_cb->loc_r_key ;
100 callback_rc = (*p_cb->p_callback)(p_cb->cb_evt, p_cb->pairing_bda, &cb_data);
102 SMP_TRACE_DEBUG2 ("callback_rc=%d p_cb->cb_evt=%d",callback_rc, p_cb->cb_evt );
104 if (callback_rc == SMP_SUCCESS && p_cb->cb_evt == SMP_IO_CAP_REQ_EVT)
106 p_cb->loc_auth_req = cb_data.io_req.auth_req;
107 p_cb->loc_io_caps = cb_data.io_req.io_cap;
108 p_cb->loc_oob_flag = cb_data.io_req.oob_data;
109 p_cb->loc_enc_size = cb_data.io_req.max_key_size;
110 p_cb->loc_i_key = cb_data.io_req.init_keys;
111 p_cb->loc_r_key = cb_data.io_req.resp_keys;
113 SMP_TRACE_WARNING2( "new io_cap = %d p_cb->loc_enc_size = %d",p_cb->loc_io_caps, p_cb->loc_enc_size);
115 smp_sm_event(p_cb, SMP_IO_RSP_EVT, NULL);
119 if (!p_cb->cb_evt && p_cb->discard_sec_req)
121 p_cb->discard_sec_req = FALSE;
122 smp_sm_event(p_cb, SMP_DISCARD_SEC_REQ_EVT, NULL);
130 void smp_send_pair_fail(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
132 p_cb->status = *(UINT8 *)p_data;
133 p_cb->failure = *(UINT8 *)p_data;
135 SMP_TRACE_DEBUG2 ("smp_send_pair_fail status=%d failure=%d ",p_cb->status, p_cb->failure);
137 if (p_cb->status <= SMP_REPEATED_ATTEMPTS && p_cb->status != SMP_SUCCESS)
139 smp_send_cmd(SMP_OPCODE_PAIRING_FAILED, p_cb);
147 void smp_send_pair_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
149 tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (p_cb->pairing_bda);
157 L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, FALSE);
165 smp_send_cmd(SMP_OPCODE_PAIRING_REQ, p_cb);
171 void smp_send_pair_rsp(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
175 p_cb->loc_i_key &= p_cb->peer_i_key;
176 p_cb->loc_r_key &= p_cb->peer_r_key;
178 if (smp_send_cmd (SMP_OPCODE_PAIRING_RSP, p_cb))
180 smp_decide_asso_model(p_cb, NULL);
188 void smp_send_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
191 smp_send_cmd(SMP_OPCODE_CONFIRM, p_cb);
197 void smp_send_init(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
202 if (p_cb->enable_test_rand_val)
205 memcpy(p_cb->rand, p_cb->test_rand, BT_OCTET16_LEN);
209 smp_send_cmd(SMP_OPCODE_INIT, p_cb);
215 void smp_send_enc_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
219 SMP_TRACE_DEBUG1 ("smp_send_enc_info p_cb->loc_enc_size = %d", p_cb->loc_enc_size);
220 smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ENC, FALSE);
222 smp_send_cmd(SMP_OPCODE_ENCRYPT_INFO, p_cb);
223 smp_send_cmd(SMP_OPCODE_MASTER_ID, p_cb);
226 le_key.div = p_cb->div;
227 le_key.key_size = p_cb->loc_enc_size;
228 le_key.sec_level = p_cb->sec_level;
229 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LENC, (tBTM_LE_KEY_VALUE *)&le_key, TRUE);
233 smp_key_distribution(p_cb, NULL);
239 void smp_send_id_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
242 smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ID, FALSE);
244 smp_send_cmd(SMP_OPCODE_IDENTITY_INFO, p_cb);
245 smp_send_cmd(SMP_OPCODE_ID_ADDR, p_cb);
249 smp_key_distribution(p_cb, NULL);
255 void smp_send_csrk_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
259 smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_CSRK, FALSE);
261 if (smp_send_cmd(SMP_OPCODE_SIGN_INFO, p_cb))
263 key.lcsrk_key.div = p_cb->div;
264 key.lcsrk_key.sec_level = p_cb->sec_level;
266 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LCSRK, &key, TRUE);
269 smp_key_distribution(p_cb, NULL);
276 void smp_send_ltk_reply(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
280 btm_ble_ltk_request_reply(p_cb->pairing_bda, TRUE, p_data->key.p_data);
286 void smp_proc_sec_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
294 p_cb->cb_evt = 0;
296 btm_ble_link_sec_check(p_cb->pairing_bda, auth_req, &sec_req_act);
304 smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
310 p_cb->peer_auth_req = auth_req;
311 p_cb->loc_r_key = p_cb->loc_i_key = SMP_SEC_DEFAULT_KEY ;
312 p_cb->cb_evt = SMP_SEC_REQUEST_EVT;
316 p_cb->discard_sec_req = TRUE;
328 void smp_proc_sec_grant(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
334 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, p_data);
339 p_cb->cb_evt = SMP_IO_CAP_REQ_EVT;
346 void smp_proc_pair_fail(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
349 p_cb->status = *(UINT8 *)p_data;
355 void smp_proc_pair_cmd(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
359 tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (p_cb->pairing_bda);
363 if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE))
366 p_cb->flags |= SMP_PAIR_FLAG_ENC_AFTER_PAIR;
368 STREAM_TO_UINT8(p_cb->peer_io_caps, p);
369 STREAM_TO_UINT8(p_cb->peer_oob_flag, p);
370 STREAM_TO_UINT8(p_cb->peer_auth_req, p);
371 STREAM_TO_UINT8(p_cb->peer_enc_size, p);
372 STREAM_TO_UINT8(p_cb->peer_i_key, p);
373 STREAM_TO_UINT8(p_cb->peer_r_key, p);
376 if (p_cb->enable_test_pair_fail)
379 if (p_cb->peer_enc_size < SMP_MIN_ENC_KEY_SIZE)
381 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
385 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &(p_cb->pair_fail_status));
392 if (p_cb->peer_enc_size < SMP_MIN_ENC_KEY_SIZE)
394 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
396 else if (p_cb->role == HCI_ROLE_SLAVE)
398 if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD))
400 p_cb->loc_i_key = p_cb->peer_i_key;
401 p_cb->loc_r_key = p_cb->peer_r_key;
405 p_cb->loc_i_key &= p_cb->peer_i_key;
406 p_cb->loc_r_key &= p_cb->peer_r_key;
409 p_cb->cb_evt = SMP_SEC_REQUEST_EVT;
416 void smp_proc_confirm(tSMP_CB *p_cb
424 STREAM_TO_ARRAY(p_cb->rconfirm, p, BT_OCTET16_LEN);
427 p_cb->flags |= SMP_PAIR_FLAGS_CMD_CONFIRM;
434 void smp_proc_init(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
439 STREAM_TO_ARRAY(p_cb->rrand, p, BT_OCTET16_LEN);
446 void smp_proc_enc_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
451 STREAM_TO_ARRAY(p_cb->ltk, p, BT_OCTET16_LEN);
453 smp_key_distribution(p_cb, NULL);
459 void smp_proc_master_id(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
465 smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ENC, TRUE);
471 memcpy(le_key.ltk, p_cb->ltk, BT_OCTET16_LEN);
472 le_key.sec_level = p_cb->sec_level;
473 le_key.key_size = p_cb->loc_enc_size;
474 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PENC, (tBTM_LE_KEY_VALUE *)&le_key, TRUE);
476 smp_key_distribution(p_cb, NULL);
482 void smp_proc_id_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
487 STREAM_TO_ARRAY (p_cb->tk, p, BT_OCTET16_LEN); /* reuse TK for IRK */
489 smp_key_distribution(p_cb, NULL);
495 void smp_proc_id_addr(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
501 smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ID, TRUE);
505 memcpy(pid_key.irk, p_cb->tk, BT_OCTET16_LEN);
508 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PID, (tBTM_LE_KEY_VALUE *)&pid_key, TRUE);
510 smp_key_distribution(p_cb, NULL);
516 void smp_proc_srk_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
521 smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_CSRK, TRUE);
524 le_key.sec_level = p_cb->sec_level;
527 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PCSRK, (tBTM_LE_KEY_VALUE *)&le_key, TRUE);
529 smp_key_distribution(p_cb, NULL);
536 void smp_proc_compare(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
543 p_cb->skip_test_compare_check ||
545 !memcmp(p_cb->rconfirm, p_data->key.p_data, BT_OCTET16_LEN))
548 if ( p_cb->peer_enc_size < p_cb->loc_enc_size)
549 p_cb->loc_enc_size = p_cb->peer_enc_size;
551 if (p_cb->role == HCI_ROLE_SLAVE)
552 smp_sm_event(p_cb, SMP_RAND_EVT, NULL);
556 p_cb->loc_i_key = p_cb->peer_i_key;
557 p_cb->loc_r_key = p_cb->peer_r_key;
559 smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
565 reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR;
566 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
573 void smp_proc_sl_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
580 smp_generate_confirm(p_cb, NULL);
586 if (p_cb->flags & SMP_PAIR_FLAGS_CMD_CONFIRM)
587 smp_sm_event(p_cb, SMP_CONFIRM_EVT, NULL);
595 void smp_start_enc(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
602 cmd = btm_ble_start_encrypt(p_cb->pairing_bda, TRUE, p_data->key.p_data);
604 cmd = btm_ble_start_encrypt(p_cb->pairing_bda, FALSE, NULL);
607 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
615 void smp_proc_discard(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
618 smp_reset_control_value(p_cb);
624 void smp_proc_release_delay(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
627 btu_stop_timer (&p_cb->rsp_timer_ent);
628 btu_start_timer (&p_cb->rsp_timer_ent, BTU_TTYPE_SMP_PAIRING_CMD,
636 void smp_proc_release_delay_tout(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
639 btu_stop_timer (&p_cb->rsp_timer_ent);
640 smp_proc_pairing_cmpl(p_cb);
648 void smp_enc_cmpl(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
654 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
662 void smp_check_auth_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
668 enc_enable, p_cb->loc_i_key, p_cb->loc_r_key);
671 if (/*((p_cb->peer_auth_req & SMP_AUTH_BOND) ||
672 (p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/
673 (p_cb->loc_i_key || p_cb->loc_r_key))
675 smp_sm_event(p_cb, SMP_BOND_REQ_EVT, NULL);
678 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
683 if (p_cb->flags & SMP_PAIR_FLAG_ENC_AFTER_PAIR)
684 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
687 else if (p_cb->role == HCI_ROLE_MASTER)
689 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
698 void smp_key_pick_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
700 UINT8 key_to_dist = (p_cb->role == HCI_ROLE_SLAVE) ? p_cb->loc_r_key : p_cb->loc_i_key;
711 (* smp_distribute_act[i])(p_cb, p_data);
721 void smp_key_distribution(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
725 p_cb->role, p_cb->loc_r_key, p_cb->loc_i_key);
727 if (p_cb->role == HCI_ROLE_SLAVE||
728 (!p_cb->loc_r_key && p_cb->role == HCI_ROLE_MASTER))
730 smp_key_pick_key(p_cb, p_data);
733 if (!p_cb->loc_i_key && !p_cb->loc_r_key)
737 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
746 void smp_decide_asso_model(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
754 SMP_TRACE_DEBUG3 ("smp_decide_asso_model p_cb->peer_io_caps = %d p_cb->loc_io_caps = %d \
755 p_cb->peer_auth_req = %02x",
756 p_cb->peer_io_caps, p_cb->loc_io_caps, p_cb->peer_auth_req);
759 if (p_cb->peer_oob_flag == SMP_OOB_PRESENT && p_cb->loc_oob_flag == SMP_OOB_PRESENT)
764 else if (SMP_NO_MITM_REQUIRED (p_cb->peer_auth_req) &&
765 SMP_NO_MITM_REQUIRED(p_cb->loc_auth_req))
771 if (p_cb->peer_io_caps < SMP_IO_CAP_MAX && p_cb->loc_io_caps < SMP_IO_CAP_MAX)
773 if (p_cb->role == HCI_ROLE_MASTER)
774 model = smp_association_table[p_cb->role][p_cb->peer_io_caps][p_cb->loc_io_caps];
776 model = smp_association_table[p_cb->role][p_cb->loc_io_caps][p_cb->peer_io_caps];
785 p_cb->sec_level = SMP_SEC_AUTHENTICATED;
786 SMP_TRACE_EVENT1 ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ", p_cb->sec_level );
787 p_cb->cb_evt = SMP_OOB_REQ_EVT;
793 p_cb->sec_level = SMP_SEC_AUTHENTICATED;
794 SMP_TRACE_EVENT1 ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ", p_cb->sec_level );
796 p_cb->cb_evt = SMP_PASSKEY_REQ_EVT;
801 p_cb->sec_level = SMP_SEC_AUTHENTICATED;
805 smp_generate_passkey(p_cb, NULL);
809 if (p_cb->role == HCI_ROLE_MASTER &&
810 ((p_cb->peer_auth_req & SMP_AUTH_YN_BIT) != 0) &&
811 ((p_cb->loc_auth_req & SMP_AUTH_YN_BIT) == 0))
820 p_cb->sec_level = SMP_SEC_UNAUTHENTICATE;
821 SMP_TRACE_EVENT1 ("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ", p_cb->sec_level );
824 key.p_data = p_cb->tk;
827 memset(p_cb->tk, 0, BT_OCTET16_LEN);
839 SMP_TRACE_EVENT1 ("sec_level=%d ", p_cb->sec_level );
841 smp_sm_event(p_cb, int_evt, p);
848 void smp_proc_io_rsp(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
851 if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)
854 smp_send_cmd(SMP_OPCODE_SEC_REQ, p_cb);
858 p_cb, NULL);
866 void smp_pairing_cmpl(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
871 if ((p_cb->status == SMP_SUCCESS) ||
872 (p_cb->status <= SMP_REPEATED_ATTEMPTS && p_cb->status != SMP_SUCCESS))
874 smp_sm_event(p_cb, SMP_RELEASE_DELAY_EVT, p_data);
879 smp_sm_event(p_cb, SMP_RELEASE_DELAY_TOUT_EVT, p_data);
888 void smp_pair_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
892 p_cb->status = SMP_CONN_TOUT;
894 smp_proc_pairing_cmpl(p_cb);
902 void smp_delay_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
906 btu_stop_timer (&p_cb->rsp_timer_ent);
910 p_cb->status = SMP_SUCCESS;
912 p_cb->status = SMP_CONN_TOUT;
914 smp_proc_pairing_cmpl(p_cb);
921 void smp_idle_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
923 if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)
926 p_cb->status = SMP_FAIL;
927 smp_proc_pairing_cmpl(p_cb);
944 tSMP_CB *p_cb = &smp_cb;
952 if (p_cb->loc_enc_size != 0 && encr_enable)
955 btm_ble_update_sec_key_size(bda, p_cb->loc_enc_size);