diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2020-08-28 21:34:08 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-08-28 21:34:08 +0000 |
commit | e59e55074c1642812fb5ba63e4f39da327fbe294 (patch) | |
tree | b3ed3ea3ee6a796b81576c791cb41554dcc39f5d | |
parent | e8ba00c87c77aa0c9673fab17d1c5d7f9ea363dd (diff) | |
parent | e45cec1547ec05bfcfb4fcf38da380c3eca77532 (diff) | |
download | bt-e59e55074c1642812fb5ba63e4f39da327fbe294.tar.gz |
Merge "Send a response to an smp security request depending on the callback event" into qt-dev
-rw-r--r-- | stack/smp/smp_api.cc | 65 |
1 files changed, 35 insertions, 30 deletions
diff --git a/stack/smp/smp_api.cc b/stack/smp/smp_api.cc index b701f27bb..f8e8a68b6 100644 --- a/stack/smp/smp_api.cc +++ b/stack/smp/smp_api.cc @@ -249,37 +249,42 @@ bool SMP_PairCancel(const RawAddress& bd_addr) { void SMP_SecurityGrant(const RawAddress& bd_addr, uint8_t res) { SMP_TRACE_EVENT("SMP_SecurityGrant "); - // If JUSTWORKS, this is used to display the consent dialog - if (smp_cb.selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) { - if (res == SMP_SUCCESS) { - smp_sm_event(&smp_cb, SMP_SC_NC_OK_EVT, NULL); - } else { - SMP_TRACE_WARNING("%s() - Consent dialog fails for JUSTWORKS", __func__); - /* send pairing failure */ - tSMP_INT_DATA smp_int_data; - smp_int_data.status = SMP_NUMERIC_COMPAR_FAIL; - smp_sm_event(&smp_cb, SMP_AUTH_CMPL_EVT, &smp_int_data); - } - } else if (smp_cb.selected_association_model == SMP_MODEL_ENCRYPTION_ONLY) { - if (res == SMP_SUCCESS) { - smp_cb.sec_level = SMP_SEC_UNAUTHENTICATE; - - tSMP_KEY key; - tSMP_INT_DATA smp_int_data; - key.key_type = SMP_KEY_TYPE_TK; - key.p_data = smp_cb.tk.data(); - smp_int_data.key = key; - - smp_cb.tk = {0}; - smp_sm_event(&smp_cb, SMP_KEY_READY_EVT, &smp_int_data); - } else { - SMP_TRACE_WARNING("%s() - Consent dialog fails for ENCRYPTION_ONLY", - __func__); - /* send pairing failure */ - tSMP_INT_DATA smp_int_data; - smp_int_data.status = SMP_NUMERIC_COMPAR_FAIL; - smp_sm_event(&smp_cb, SMP_AUTH_CMPL_EVT, &smp_int_data); + // If just showing consent dialog, send response + if (smp_cb.cb_evt == SMP_CONSENT_REQ_EVT) { + // If JUSTWORKS, this is used to display the consent dialog + if (smp_cb.selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) { + if (res == SMP_SUCCESS) { + smp_sm_event(&smp_cb, SMP_SC_NC_OK_EVT, NULL); + } else { + SMP_TRACE_WARNING("%s() - Consent dialog fails for JUSTWORKS", + __func__); + /* send pairing failure */ + tSMP_INT_DATA smp_int_data; + smp_int_data.status = SMP_NUMERIC_COMPAR_FAIL; + smp_sm_event(&smp_cb, SMP_AUTH_CMPL_EVT, &smp_int_data); + } + } else if (smp_cb.selected_association_model == SMP_MODEL_ENCRYPTION_ONLY) { + if (res == SMP_SUCCESS) { + smp_cb.sec_level = SMP_SEC_UNAUTHENTICATE; + + tSMP_KEY key; + tSMP_INT_DATA smp_int_data; + key.key_type = SMP_KEY_TYPE_TK; + key.p_data = smp_cb.tk.data(); + smp_int_data.key = key; + + smp_cb.tk = {0}; + smp_sm_event(&smp_cb, SMP_KEY_READY_EVT, &smp_int_data); + } else { + SMP_TRACE_WARNING("%s() - Consent dialog fails for ENCRYPTION_ONLY", + __func__); + /* send pairing failure */ + tSMP_INT_DATA smp_int_data; + smp_int_data.status = SMP_NUMERIC_COMPAR_FAIL; + smp_sm_event(&smp_cb, SMP_AUTH_CMPL_EVT, &smp_int_data); + } } + return; } if (smp_cb.smp_over_br) { |