if (reason == SMP_PAIR_AUTH_FAIL || reason == SMP_PAIR_FAIL_UNKNOWN ||
reason == SMP_PAIR_NOT_SUPPORT || reason == SMP_PASSKEY_ENTRY_FAIL ||
reason == SMP_REPEATED_ATTEMPTS) {
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = reason;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return true;
}
return false;
* Description pairing failure to peer device if needed.
******************************************************************************/
void smp_send_pair_fail(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- p_cb->status = *(uint8_t*)p_data;
- p_cb->failure = *(uint8_t*)p_data;
+ p_cb->status = p_data->status;
+ p_cb->failure = p_data->status;
SMP_TRACE_DEBUG("%s: status=%d failure=%d ", __func__, p_cb->status,
p_cb->failure);
* Description send Keypress Notification command to the peer
******************************************************************************/
void smp_send_keypress_notification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- p_cb->local_keypress_notification = *(uint8_t*)p_data;
+ p_cb->local_keypress_notification = p_data->status;
smp_send_cmd(SMP_OPCODE_PAIR_KEYPR_NOTIF, p_cb);
}
void smp_proc_sec_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
tBTM_LE_AUTH_REQ auth_req = *(tBTM_LE_AUTH_REQ*)p_data;
tBTM_BLE_SEC_REQ_ACT sec_req_act;
- uint8_t reason;
SMP_TRACE_DEBUG("%s: auth_req=0x%x", __func__, auth_req);
/* respond to non SC pairing request as failure in SC only mode */
if (p_cb->secure_connections_only_mode_required &&
(auth_req & SMP_SC_SUPPORT_BIT) == 0) {
- reason = SMP_PAIR_AUTH_FAIL;
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_PAIR_AUTH_FAIL;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
} else {
/* initialize local i/r key to be default keys */
p_cb->peer_auth_req = auth_req;
* Description process security grant.
******************************************************************************/
void smp_proc_sec_grant(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t res = *(uint8_t*)p_data;
+ uint8_t res = p_data->status;
SMP_TRACE_DEBUG("%s", __func__);
if (res != SMP_SUCCESS) {
smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, p_data);
******************************************************************************/
void smp_proc_pair_fail(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
SMP_TRACE_DEBUG("%s", __func__);
- p_cb->status = *(uint8_t*)p_data;
+ p_cb->status = p_data->status;
/* Cancel pending auth complete timer if set */
alarm_cancel(p_cb->delayed_auth_timer_ent);
* Description Process the SMP pairing request/response from peer device
******************************************************************************/
void smp_proc_pair_cmd(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t* p = (uint8_t*)p_data;
- uint8_t reason = SMP_ENC_KEY_SIZE;
+ uint8_t* p = p_data->p_data;
tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
SMP_TRACE_DEBUG("%s", __func__);
STREAM_TO_UINT8(p_cb->peer_r_key, p);
if (smp_command_has_invalid_parameters(p_cb)) {
- reason = SMP_INVALID_PARAMETERS;
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_INVALID_PARAMETERS;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
SMP_TRACE_ERROR(
"%s: pairing failed - slave requires secure connection only mode",
__func__);
- reason = SMP_PAIR_AUTH_FAIL;
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_PAIR_AUTH_FAIL;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
SMP_TRACE_ERROR(
"Master requires secure connection only mode "
"but it can't be provided -> Master fails pairing");
- reason = SMP_PAIR_AUTH_FAIL;
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_PAIR_AUTH_FAIL;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
* Description process pairing confirm from peer device
******************************************************************************/
void smp_proc_confirm(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t* p = (uint8_t*)p_data;
- uint8_t reason = SMP_INVALID_PARAMETERS;
+ uint8_t* p = p_data->p_data;
SMP_TRACE_DEBUG("%s", __func__);
if (smp_command_has_invalid_parameters(p_cb)) {
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_INVALID_PARAMETERS;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
* Description process pairing initializer from peer device
******************************************************************************/
void smp_proc_init(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t* p = (uint8_t*)p_data;
- uint8_t reason = SMP_INVALID_PARAMETERS;
+ uint8_t* p = p_data->p_data;
SMP_TRACE_DEBUG("%s", __func__);
if (smp_command_has_invalid_parameters(p_cb)) {
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_INVALID_PARAMETERS;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
* Description process pairing random (nonce) from peer device
******************************************************************************/
void smp_proc_rand(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t* p = (uint8_t*)p_data;
- uint8_t reason = SMP_INVALID_PARAMETERS;
+ uint8_t* p = p_data->p_data;
SMP_TRACE_DEBUG("%s", __func__);
if (smp_command_has_invalid_parameters(p_cb)) {
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_INVALID_PARAMETERS;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
*
******************************************************************************/
void smp_process_pairing_public_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t* p = (uint8_t*)p_data;
- uint8_t reason = SMP_INVALID_PARAMETERS;
+ uint8_t* p = p_data->p_data;
SMP_TRACE_DEBUG("%s", __func__);
if (smp_command_has_invalid_parameters(p_cb)) {
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_INVALID_PARAMETERS;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
* Description process pairing commitment from peer device
******************************************************************************/
void smp_process_pairing_commitment(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t* p = (uint8_t*)p_data;
- uint8_t reason = SMP_INVALID_PARAMETERS;
+ uint8_t* p = p_data->p_data;
SMP_TRACE_DEBUG("%s", __func__);
if (smp_command_has_invalid_parameters(p_cb)) {
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_INVALID_PARAMETERS;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
* Description process DHKey Check from peer device
******************************************************************************/
void smp_process_dhkey_check(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t* p = (uint8_t*)p_data;
- uint8_t reason = SMP_INVALID_PARAMETERS;
+ uint8_t* p = p_data->p_data;
SMP_TRACE_DEBUG("%s", __func__);
if (smp_command_has_invalid_parameters(p_cb)) {
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_INVALID_PARAMETERS;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
* Description process pairing keypress notification from peer device
******************************************************************************/
void smp_process_keypress_notification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t* p = (uint8_t*)p_data;
- uint8_t reason = SMP_INVALID_PARAMETERS;
+ uint8_t* p = p_data->p_data;
SMP_TRACE_DEBUG("%s", __func__);
- p_cb->status = *(uint8_t*)p_data;
+ p_cb->status = p_data->status;
if (smp_command_has_invalid_parameters(p_cb)) {
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_INVALID_PARAMETERS;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
* BR/EDR transport.
******************************************************************************/
void smp_br_process_pairing_command(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t* p = (uint8_t*)p_data;
- uint8_t reason = SMP_ENC_KEY_SIZE;
+ uint8_t* p = p_data->p_data;
tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
SMP_TRACE_DEBUG("%s", __func__);
/* rejecting BR pairing request over non-SC BR link */
if (!p_dev_rec->new_encryption_key_is_p256 && p_cb->role == HCI_ROLE_SLAVE) {
- reason = SMP_XTRANS_DERIVE_NOT_ALLOW;
- smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_XTRANS_DERIVE_NOT_ALLOW;
+ smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
return;
}
STREAM_TO_UINT8(p_cb->peer_r_key, p);
if (smp_command_has_invalid_parameters(p_cb)) {
- reason = SMP_INVALID_PARAMETERS;
- smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_INVALID_PARAMETERS;
+ smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
return;
}
* Description process security grant in case of pairing over BR/EDR transport.
******************************************************************************/
void smp_br_process_security_grant(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t res = *(uint8_t*)p_data;
SMP_TRACE_DEBUG("%s", __func__);
- if (res != SMP_SUCCESS) {
+ if (p_data->status != SMP_SUCCESS) {
smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, p_data);
} else {
/* otherwise, start pairing; send IO request callback */
* before starting the distribution/derivation
******************************************************************************/
void smp_br_check_authorization_request(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t reason = SMP_SUCCESS;
-
SMP_TRACE_DEBUG("%s rcvs i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
__func__, p_cb->local_i_key, p_cb->local_r_key);
if (p_cb->role == HCI_ROLE_MASTER && p_cb->local_r_key == 0)
smp_key_distribution_by_transport(p_cb, NULL);
} else {
- smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_SUCCESS;
+ smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
}
}
* used.
******************************************************************************/
void smp_br_select_next_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t reason = SMP_SUCCESS;
SMP_TRACE_DEBUG("%s role=%d (0-master) r_keys=0x%x i_keys=0x%x", __func__,
p_cb->role, p_cb->local_r_key, p_cb->local_i_key);
if (!p_cb->local_i_key && !p_cb->local_r_key) {
/* state check to prevent re-entrance */
if (smp_get_br_state() == SMP_BR_STATE_BOND_PENDING) {
- if (p_cb->total_tx_unacked == 0)
- smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason);
- else
+ if (p_cb->total_tx_unacked == 0) {
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_SUCCESS;
+ smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
+ } else {
p_cb->wait_for_authorization_complete = true;
+ }
}
}
}
* Description process encryption information from peer device
******************************************************************************/
void smp_proc_enc_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t* p = (uint8_t*)p_data;
+ uint8_t* p = p_data->p_data;
SMP_TRACE_DEBUG("%s", __func__);
STREAM_TO_ARRAY(p_cb->ltk, p, BT_OCTET16_LEN);
* Description process master ID from slave device
******************************************************************************/
void smp_proc_master_id(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t* p = (uint8_t*)p_data;
+ uint8_t* p = p_data->p_data;
tBTM_LE_PENC_KEYS le_key;
SMP_TRACE_DEBUG("%s", __func__);
* Description process identity information from peer device
******************************************************************************/
void smp_proc_id_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t* p = (uint8_t*)p_data;
+ uint8_t* p = p_data->p_data;
SMP_TRACE_DEBUG("%s", __func__);
STREAM_TO_ARRAY(p_cb->tk, p, BT_OCTET16_LEN); /* reuse TK for IRK */
* Description process identity address from peer device
******************************************************************************/
void smp_proc_id_addr(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t* p = (uint8_t*)p_data;
+ uint8_t* p = p_data->p_data;
tBTM_LE_PID_KEYS pid_key;
SMP_TRACE_DEBUG("%s", __func__);
le_key.sec_level = p_cb->sec_level;
/* get peer CSRK */
- maybe_non_aligned_memcpy(le_key.csrk, p_data, BT_OCTET16_LEN);
+ maybe_non_aligned_memcpy(le_key.csrk, p_data->p_data, BT_OCTET16_LEN);
/* initialize the peer counter */
le_key.counter = 0;
* Description process compare value
******************************************************************************/
void smp_proc_compare(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t reason;
-
SMP_TRACE_DEBUG("%s", __func__);
if (!memcmp(p_cb->rconfirm, p_data->key.p_data, BT_OCTET16_LEN)) {
/* compare the max encryption key size, and save the smaller one for the
}
} else {
- reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR;
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
+ p_cb->failure = SMP_CONFIRM_VALUE_ERR;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
}
}
******************************************************************************/
void smp_start_enc(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
tBTM_STATUS cmd;
- uint8_t reason = SMP_ENC_FAIL;
SMP_TRACE_DEBUG("%s", __func__);
if (p_data != NULL)
else
cmd = btm_ble_start_encrypt(p_cb->pairing_bda, false, NULL);
- if (cmd != BTM_CMD_STARTED && cmd != BTM_BUSY)
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ if (cmd != BTM_CMD_STARTED && cmd != BTM_BUSY) {
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_ENC_FAIL;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
+ }
}
/*******************************************************************************
* Description encryption success
******************************************************************************/
void smp_enc_cmpl(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t enc_enable = *(uint8_t*)p_data;
- uint8_t reason = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
+ uint8_t enc_enable = p_data->status;
SMP_TRACE_DEBUG("%s", __func__);
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
}
/*******************************************************************************
* Description check authentication request
******************************************************************************/
void smp_check_auth_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t enc_enable = *(uint8_t*)p_data;
- uint8_t reason = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
+ uint8_t enc_enable = p_data->status;
SMP_TRACE_DEBUG(
"%s rcvs enc_enable=%d i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
(p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/
(p_cb->local_i_key || p_cb->local_r_key)) {
smp_sm_event(p_cb, SMP_BOND_REQ_EVT, NULL);
- } else
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ } else {
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
+ }
} else if (enc_enable == 0) {
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
/* if failed for encryption after pairing, send callback */
if (p_cb->flags & SMP_PAIR_FLAG_ENC_AFTER_PAIR)
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
/* if enc failed for old security information */
/* if master device, clean up and abck to idle; slave device do nothing */
else if (p_cb->role == HCI_ROLE_MASTER) {
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
}
}
}
*
******************************************************************************/
void smp_decide_association_model(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t failure = SMP_UNKNOWN_IO_CAP;
uint8_t int_evt = 0;
- tSMP_KEY key;
- tSMP_INT_DATA* p = NULL;
+ tSMP_INT_DATA smp_int_data;
SMP_TRACE_DEBUG("%s Association Model = %d", __func__,
p_cb->selected_association_model);
((p_cb->loc_auth_req & SMP_AUTH_YN_BIT) == 0)) {
SMP_TRACE_ERROR(
"IO capability does not meet authentication requirement");
- failure = SMP_PAIR_AUTH_FAIL;
- p = (tSMP_INT_DATA*)&failure;
+ smp_int_data.status = SMP_PAIR_AUTH_FAIL;
int_evt = SMP_AUTH_CMPL_EVT;
} else {
p_cb->sec_level = SMP_SEC_UNAUTHENTICATE;
SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ",
p_cb->sec_level);
+ tSMP_KEY key;
key.key_type = SMP_KEY_TYPE_TK;
key.p_data = p_cb->tk;
- p = (tSMP_INT_DATA*)&key;
+ smp_int_data.key = key;
memset(p_cb->tk, 0, BT_OCTET16_LEN);
/* TK, ready */
case SMP_MODEL_OUT_OF_RANGE:
SMP_TRACE_ERROR("Association Model = SMP_MODEL_OUT_OF_RANGE (failed)");
- p = (tSMP_INT_DATA*)&failure;
+ smp_int_data.status = SMP_UNKNOWN_IO_CAP;
int_evt = SMP_AUTH_CMPL_EVT;
break;
SMP_TRACE_ERROR(
"Association Model = %d (SOMETHING IS WRONG WITH THE CODE)",
p_cb->selected_association_model);
- p = (tSMP_INT_DATA*)&failure;
+ smp_int_data.status = SMP_UNKNOWN_IO_CAP;
int_evt = SMP_AUTH_CMPL_EVT;
}
SMP_TRACE_EVENT("sec_level=%d ", p_cb->sec_level);
- if (int_evt) smp_sm_event(p_cb, int_evt, p);
+ if (int_evt) smp_sm_event(p_cb, int_evt, &smp_int_data);
}
/*******************************************************************************
* Description process IO response for a slave device.
******************************************************************************/
void smp_process_io_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t reason = SMP_PAIR_AUTH_FAIL;
SMP_TRACE_DEBUG("%s", __func__);
if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) {
SMP_TRACE_ERROR(
"Slave requires secure connection only mode "
"but it can't be provided -> Slave fails pairing");
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_PAIR_AUTH_FAIL;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
* Note It is supposed to be called in SC phase1.
******************************************************************************/
void smp_process_peer_nonce(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t reason;
-
SMP_TRACE_DEBUG("%s start ", __func__);
// PTS Testing failure modes
if (p_cb->cert_failure == SMP_CONFIRM_VALUE_ERR) {
SMP_TRACE_ERROR("%s failure case = %d", __func__, p_cb->cert_failure);
- reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR;
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
+ p_cb->failure = SMP_CONFIRM_VALUE_ERR;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
// PTS Testing failure modes (for LT)
(p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) &&
(p_cb->role == HCI_ROLE_SLAVE)) {
SMP_TRACE_ERROR("%s failure case = %d", __func__, p_cb->cert_failure);
- reason = p_cb->failure = SMP_NUMERIC_COMPAR_FAIL;
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_NUMERIC_COMPAR_FAIL;
+ p_cb->failure = SMP_NUMERIC_COMPAR_FAIL;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
/* in these models only master receives commitment */
if (p_cb->role == HCI_ROLE_MASTER) {
if (!smp_check_commitment(p_cb)) {
- reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR;
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
+ p_cb->failure = SMP_CONFIRM_VALUE_ERR;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
break;
}
} else {
case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
if (!smp_check_commitment(p_cb) &&
p_cb->cert_failure != SMP_NUMERIC_COMPAR_FAIL) {
- reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR;
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
+ p_cb->failure = SMP_CONFIRM_VALUE_ERR;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
break;
}
* received from the peer DHKey check value.
******************************************************************************/
void smp_match_dhkey_checks(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- uint8_t reason = SMP_DHKEY_CHK_FAIL;
SMP_TRACE_DEBUG("%s", __func__);
if (memcmp(p_data->key.p_data, p_cb->remote_dhkey_check, BT_OCTET16_LEN)) {
SMP_TRACE_WARNING("dhkey chcks do no match");
- p_cb->failure = reason;
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_DHKEY_CHK_FAIL;
+ p_cb->failure = SMP_DHKEY_CHK_FAIL;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
memcpy(p_cb->remote_commitment, p_sc_oob_data->peer_oob_data.commitment,
sizeof(p_cb->remote_commitment));
- uint8_t reason = SMP_CONFIRM_VALUE_ERR;
/* check commitment */
if (!smp_check_commitment(p_cb)) {
- p_cb->failure = reason;
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
+ p_cb->failure = SMP_CONFIRM_VALUE_ERR;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
btm_ble_update_sec_key_size(bda, p_cb->loc_enc_size);
}
- smp_sm_event(&smp_cb, SMP_ENCRYPTED_EVT, &encr_enable);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = encr_enable;
+ smp_sm_event(&smp_cb, SMP_ENCRYPTED_EVT, &smp_int_data);
}
}
SMP_TRACE_DEBUG("%s", __func__);
if (!smp_calculate_link_key_from_long_term_key(p_cb)) {
SMP_TRACE_ERROR("%s failed", __func__);
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = status;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
}
SMP_TRACE_DEBUG("%s", __func__);
if (!smp_calculate_long_term_key_from_link_key(p_cb)) {
SMP_TRACE_ERROR("%s: failed", __func__);
- smp_sm_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &status);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = status;
+ smp_sm_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
return;
}
******************************************************************************/
tSMP_STATUS SMP_Pair(const RawAddress& bd_addr) {
tSMP_CB* p_cb = &smp_cb;
- uint8_t status = SMP_PAIR_INTERNAL_ERR;
SMP_TRACE_EVENT("%s state=%d br_state=%d flag=0x%x ", __func__, p_cb->state,
p_cb->br_state, p_cb->flags);
p_cb->pairing_bda = bd_addr;
if (!L2CA_ConnectFixedChnl(L2CAP_SMP_CID, bd_addr)) {
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_PAIR_INTERNAL_ERR;
SMP_TRACE_ERROR("%s: L2C connect fixed channel failed.", __func__);
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
- return status;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
+ return SMP_PAIR_INTERNAL_ERR;
}
return SMP_STARTED;
******************************************************************************/
tSMP_STATUS SMP_BR_PairWith(const RawAddress& bd_addr) {
tSMP_CB* p_cb = &smp_cb;
- uint8_t status = SMP_PAIR_INTERNAL_ERR;
SMP_TRACE_EVENT("%s state=%d br_state=%d flag=0x%x ", __func__, p_cb->state,
p_cb->br_state, p_cb->flags);
if (!L2CA_ConnectFixedChnl(L2CAP_SMP_BR_CID, bd_addr)) {
SMP_TRACE_ERROR("%s: L2C connect fixed channel failed.", __func__);
- smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &status);
- return status;
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_PAIR_INTERNAL_ERR;
+ smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
+ return SMP_PAIR_INTERNAL_ERR;
}
return SMP_STARTED;
bool SMP_PairCancel(const RawAddress& bd_addr) {
tSMP_CB* p_cb = &smp_cb;
uint8_t err_code = SMP_PAIR_FAIL_UNKNOWN;
- bool status = false;
// PTS SMP failure test cases
if (p_cb->cert_failure == SMP_PASSKEY_ENTRY_FAIL ||
if (p_cb->state != SMP_STATE_IDLE && p_cb->pairing_bda == bd_addr) {
p_cb->is_pair_cancel = true;
SMP_TRACE_DEBUG("Cancel Pairing: set fail reason Unknown");
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &err_code);
- status = true;
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_PAIR_FAIL_UNKNOWN;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
+ return true;
}
- return status;
+ return false;
}
/*******************************************************************************
*
/* clear the SMP_SEC_REQUEST_EVT event after get grant */
/* avoid generating duplicate pair request */
smp_cb.cb_evt = 0;
- smp_br_state_machine_event(&smp_cb, SMP_BR_API_SEC_GRANT_EVT, &res);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = res;
+ smp_br_state_machine_event(&smp_cb, SMP_BR_API_SEC_GRANT_EVT,
+ &smp_int_data);
return;
}
/* clear the SMP_SEC_REQUEST_EVT event after get grant */
/* avoid generate duplicate pair request */
smp_cb.cb_evt = 0;
- smp_sm_event(&smp_cb, SMP_API_SEC_GRANT_EVT, &res);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = res;
+ smp_sm_event(&smp_cb, SMP_API_SEC_GRANT_EVT, &smp_int_data);
}
/*******************************************************************************
void SMP_PasskeyReply(const RawAddress& bd_addr, uint8_t res,
uint32_t passkey) {
tSMP_CB* p_cb = &smp_cb;
- uint8_t failure = SMP_PASSKEY_ENTRY_FAIL;
SMP_TRACE_EVENT("SMP_PasskeyReply: Key: %d Result:%d", passkey, res);
"SMP_PasskeyReply() - Wrong key len: %d or passkey entry fail",
passkey);
/* send pairing failure */
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_PASSKEY_ENTRY_FAIL;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
} else if (p_cb->selected_association_model ==
SMP_MODEL_SEC_CONN_PASSKEY_ENT) {
- smp_sm_event(&smp_cb, SMP_SC_KEY_READY_EVT, &passkey);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.passkey = passkey;
+ smp_sm_event(&smp_cb, SMP_SC_KEY_READY_EVT, &smp_int_data);
} else {
smp_convert_string_to_tk(p_cb->tk, passkey);
}
******************************************************************************/
void SMP_ConfirmReply(const RawAddress& bd_addr, uint8_t res) {
tSMP_CB* p_cb = &smp_cb;
- uint8_t failure = SMP_NUMERIC_COMPAR_FAIL;
SMP_TRACE_EVENT("%s: Result:%d", __func__, res);
if (res != SMP_SUCCESS) {
SMP_TRACE_WARNING("%s() - Numeric Comparison fails", __func__);
/* send pairing failure */
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_NUMERIC_COMPAR_FAIL;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
} else {
smp_sm_event(p_cb, SMP_SC_NC_OK_EVT, NULL);
}
void SMP_OobDataReply(const RawAddress& bd_addr, tSMP_STATUS res, uint8_t len,
uint8_t* p_data) {
tSMP_CB* p_cb = &smp_cb;
- uint8_t failure = SMP_OOB_FAIL;
tSMP_KEY key;
SMP_TRACE_EVENT("%s State: %d res:%d", __func__, smp_cb.state, res);
return;
if (res != SMP_SUCCESS || len == 0 || !p_data) {
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_OOB_FAIL;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
} else {
if (len > BT_OCTET16_LEN) len = BT_OCTET16_LEN;
key.key_type = SMP_KEY_TYPE_TK;
key.p_data = p_cb->tk;
- smp_sm_event(&smp_cb, SMP_KEY_READY_EVT, &key);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.key = key;
+ smp_sm_event(&smp_cb, SMP_KEY_READY_EVT, &smp_int_data);
}
}
void SMP_SecureConnectionOobDataReply(uint8_t* p_data) {
tSMP_CB* p_cb = &smp_cb;
- uint8_t failure = SMP_OOB_FAIL;
tSMP_SC_OOB_DATA* p_oob = (tSMP_SC_OOB_DATA*)p_data;
if (!p_oob) {
SMP_TRACE_ERROR("%s received no data", __func__);
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_OOB_FAIL;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
break;
}
+ tSMP_INT_DATA smp_int_data;
if (data_missing) {
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure);
+ smp_int_data.status = SMP_OOB_FAIL;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
p_cb->sc_oob_data = *p_oob;
- smp_sm_event(&smp_cb, SMP_SC_OOB_DATA_EVT, p_data);
+ smp_int_data.p_data = p_data;
+ smp_sm_event(&smp_cb, SMP_SC_OOB_DATA_EVT, &smp_int_data);
}
/*******************************************************************************
return;
}
- smp_sm_event(p_cb, SMP_KEYPRESS_NOTIFICATION_EVENT, &value);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = value;
+ smp_sm_event(p_cb, SMP_KEYPRESS_NOTIFICATION_EVENT, &smp_int_data);
}
/*******************************************************************************
******************************************************************************/
void smp_proc_passkey(tSMP_CB* p_cb, BT_OCTET8 rand) {
uint8_t* tt = p_cb->tk;
- tSMP_KEY key;
uint32_t passkey; /* 19655 test number; */
uint8_t* pp = rand;
memset(p_cb->tk, 0, BT_OCTET16_LEN);
UINT32_TO_STREAM(tt, passkey);
- key.key_type = SMP_KEY_TYPE_TK;
- key.p_data = p_cb->tk;
-
if (p_cb->p_callback) {
+ tSMP_EVT_DATA smp_evt_data;
+ smp_evt_data.passkey = passkey;
(*p_cb->p_callback)(SMP_PASSKEY_NOTIF_EVT, p_cb->pairing_bda,
- (tSMP_EVT_DATA*)&passkey);
+ &smp_evt_data);
}
if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_PASSKEY_DISP) {
- smp_sm_event(&smp_cb, SMP_KEY_READY_EVT, &passkey);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.passkey = passkey;
+ smp_sm_event(&smp_cb, SMP_KEY_READY_EVT, &smp_int_data);
} else {
- smp_sm_event(p_cb, SMP_KEY_READY_EVT, (tSMP_INT_DATA*)&key);
+ tSMP_KEY key;
+ key.key_type = SMP_KEY_TYPE_TK;
+ key.p_data = p_cb->tk;
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.key = key;
+ smp_sm_event(p_cb, SMP_KEY_READY_EVT, &smp_int_data);
}
}
******************************************************************************/
void smp_generate_stk(tSMP_CB* p_cb, UNUSED_ATTR tSMP_INT_DATA* p_data) {
tSMP_ENC output;
- tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
SMP_TRACE_DEBUG("%s", __func__);
memcpy(output.param_buf, p_cb->ltk, SMP_ENCRYT_DATA_SIZE);
} else if (!smp_calculate_legacy_short_term_key(p_cb, &output)) {
SMP_TRACE_ERROR("%s failed", __func__);
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_PAIR_FAIL_UNKNOWN;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
uint16_t r = 1;
uint8_t* p = buffer;
tSMP_ENC output;
- tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
p_cb->div = div;
if (!SMP_Encrypt(er, BT_OCTET16_LEN, buffer, 4, &output)) {
SMP_TRACE_ERROR("smp_generate_csrk failed");
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_PAIR_FAIL_UNKNOWN;
if (p_cb->smp_over_br) {
- smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &status);
+ smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
} else {
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
}
} else {
memcpy((void*)p_cb->csrk, output.param_buf, BT_OCTET16_LEN);
tSMP_ENC output;
tSMP_STATUS status = smp_calculate_comfirm(p_cb, p_cb->rand, &output);
if (status != SMP_SUCCESS) {
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = status;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
tSMP_KEY key;
16);
key.key_type = SMP_KEY_TYPE_CFM;
key.p_data = output.param_buf;
- smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.key = key;
+ smp_sm_event(p_cb, SMP_KEY_READY_EVT, &smp_int_data);
}
/*******************************************************************************
tSMP_ENC output;
tSMP_STATUS status = smp_calculate_comfirm(p_cb, p_cb->rrand, &output);
if (status != SMP_SUCCESS) {
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = status;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
tSMP_KEY key;
"Remote Confirm generated", 16);
key.key_type = SMP_KEY_TYPE_CMP;
key.p_data = output.param_buf;
- smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.key = key;
+ smp_sm_event(p_cb, SMP_KEY_READY_EVT, &smp_int_data);
}
/*******************************************************************************
key.key_type = SMP_KEY_TYPE_STK;
key.p_data = p->param_buf;
- smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.key = key;
+ smp_sm_event(p_cb, SMP_KEY_READY_EVT, &smp_int_data);
}
/**
key.key_type = SMP_KEY_TYPE_LTK;
key.p_data = p->param_buf;
- smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.key = key;
+ smp_sm_event(p_cb, SMP_KEY_READY_EVT, &smp_int_data);
}
/**
tSMP_ENC output;
if (!SMP_Encrypt(dhk, BT_OCTET16_LEN, rand, BT_OCTET8_LEN, &output)) {
SMP_TRACE_ERROR("%s failed", __func__);
- tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_PAIR_FAIL_UNKNOWN;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
} else {
smp_process_ediv(p_cb, &output);
}
if (!SMP_Encrypt(er, BT_OCTET16_LEN, (uint8_t*)&p_cb->div, sizeof(uint16_t),
&output)) {
SMP_TRACE_ERROR("%s failed", __func__);
- tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_PAIR_FAIL_UNKNOWN;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
} else {
/* mask the LTK */
smp_mask_enc_key(p_cb->loc_enc_size, output.param_buf);
}
if (p_cb->number_to_display >= (BTM_MAX_PASSKEY_VAL + 1)) {
- uint8_t reason;
- reason = p_cb->failure = SMP_PAIR_FAIL_UNKNOWN;
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_PAIR_FAIL_UNKNOWN;
+ p_cb->failure = SMP_PAIR_FAIL_UNKNOWN;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
return;
}
SMP_TRACE_EVENT("Number to display in numeric comparison = %d",
p_cb->number_to_display);
p_cb->cb_evt = SMP_NC_REQ_EVT;
- smp_sm_event(p_cb, SMP_SC_DSPL_NC_EVT, &p_cb->number_to_display);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.passkey = p_cb->number_to_display;
+ smp_sm_event(p_cb, SMP_SC_DSPL_NC_EVT, &smp_int_data);
return;
}
BT_OCTET16 param_buf;
bool ret;
tSMP_KEY key;
- tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
SMP_TRACE_DEBUG("%s", __func__);
#endif
key.key_type = SMP_KEY_TYPE_PEER_DHK_CHCK;
key.p_data = param_buf;
- smp_sm_event(p_cb, SMP_SC_KEY_READY_EVT, &key);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.key = key;
+ smp_sm_event(p_cb, SMP_SC_KEY_READY_EVT, &smp_int_data);
} else {
SMP_TRACE_EVENT("peer DHKey check calculation failed");
- smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
+ tSMP_INT_DATA smp_int_data;
+ smp_int_data.status = SMP_PAIR_FAIL_UNKNOWN;
+ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
}
}