15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 1999-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * this file contains GATT authentication handling functions 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 255cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gatt_int.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gatt_api.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_sign_data 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sign the data for write command. 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if encrypted, otherwise FALSE. 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN gatt_sign_data (tGATT_CLCB *p_clcb) 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_VALUE *p_attr = (tGATT_VALUE *)p_clcb->p_attr_buf; 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_data = NULL, *p; 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 payload_size = p_clcb->p_tcb->payload_size; 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status = FALSE; 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_signature; 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* do not need to mark channel securoty activity for data signing */ 53ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_set_sec_act(p_clcb->p_tcb, GATT_SEC_OK); 54ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data = (UINT8 *)GKI_getbuf((UINT16)(p_attr->len + 3)); /* 3 = 2 byte handle + opcode */ 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data != NULL) 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = p_data; 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, GATT_SIGN_CMD_WRITE); 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, p_attr->handle); 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM(p, p_attr->value, p_attr->len); 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sign data length should be attribulte value length plus 2B handle + 1B op code */ 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((payload_size - GATT_AUTH_SIGN_LEN - 3) < p_attr->len) 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->len = payload_size - GATT_AUTH_SIGN_LEN - 3; 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_signature = p_attr->value + p_attr->len; 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_BleDataSignature(p_clcb->p_tcb->peer_bda, 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data, 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT16)(p_attr->len + 3), /* 3 = 2 byte handle + opcode */ 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_signature)) 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr->len += BTM_BLE_AUTH_SIGN_LEN; 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_set_ch_state(p_clcb->p_tcb, GATT_CH_OPEN); 76ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_act_write(p_clcb, GATT_SEC_SIGN_DATA); 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_end_operation(p_clcb, GATT_INTERNAL_ERROR, NULL); 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_data); 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_verify_signature 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function start to verify the sign data when receiving 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the data from peer device. 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_verify_signature(tGATT_TCB *p_tcb, BT_HDR *p_buf) 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 cmd_len; 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 op_code; 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p, *p_orig = (UINT8 *)(p_buf + 1) + p_buf->offset; 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 counter; 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cmd_len = p_buf->len - GATT_AUTH_SIGN_LEN + 4; 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = p_orig + cmd_len - 4; 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT32(counter, p); 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_BleVerifySignature(p_tcb->peer_bda, p_orig, cmd_len, counter, p)) 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8(op_code, p_orig); 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_server_handle_client_req (p_tcb, op_code, (UINT16)(p_buf->len - 1), p_orig); 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1178fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta /* if this is a bad signature, assume from attacker, ignore it */ 118b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("Signature Verification Failed, data ignored"); 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_sec_check_complete 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description security check complete and proceed to data sending action. 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void. 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 132ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid gatt_sec_check_complete(BOOLEAN sec_check_ok, tGATT_CLCB *p_clcb, UINT8 sec_act) 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13432429188798b1f34fcf2cc609fd70ed85f20264bAndre Eisenbach if (p_clcb && p_clcb->p_tcb && GKI_queue_is_empty(&p_clcb->p_tcb->pending_enc_clcb)) 135ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_set_sec_act(p_clcb->p_tcb, GATT_SEC_NONE); 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!sec_check_ok) 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_end_operation(p_clcb, GATT_AUTH_FAIL, NULL); 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_clcb->operation == GATTC_OPTYPE_WRITE) 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 143ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_act_write(p_clcb, sec_act); 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_clcb->operation == GATTC_OPTYPE_READ) 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_act_read(p_clcb, p_clcb->counter); 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_enc_cmpl_cback 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description link encryption complete callback. 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1598fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Battavoid gatt_enc_cmpl_cback(BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, tBTM_STATUS result) 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb; 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 sec_flag; 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status = FALSE; 164ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGATT_PENDING_ENC_CLCB *p_buf; 165ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 count; 1665cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_ref_data); 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 168b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_enc_cmpl_cback"); 1698fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if ((p_tcb = gatt_find_tcb_by_addr(bd_addr, transport)) != NULL) 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 171ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (gatt_get_sec_act(p_tcb) == GATT_SEC_ENC_PENDING) 172ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 174ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_buf = (tGATT_PENDING_ENC_CLCB *)GKI_dequeue (&p_tcb->pending_enc_clcb)) != NULL) 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 176ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (result == BTM_SUCCESS) 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 178ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (gatt_get_sec_act(p_tcb) == GATT_SEC_ENCRYPT_MITM ) 179ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1808fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta BTM_GetSecurityFlagsByTransport(bd_addr, &sec_flag, transport); 1818fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta 1828fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED) 183ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 184ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta status = TRUE; 185ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 186ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 187ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = TRUE; 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 192ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_sec_check_complete(status , p_buf->p_clcb, p_tcb->sec_act); 193ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_freebuf(p_buf); 194ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* start all other pending operation in queue */ 195ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta count = p_tcb->pending_enc_clcb.count; 196ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (; count > 0; count --) 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 198ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_buf = (tGATT_PENDING_ENC_CLCB *)GKI_dequeue (&p_tcb->pending_enc_clcb)) != NULL) 199ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 200ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_security_check_start(p_buf->p_clcb); 201ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_freebuf(p_buf); 202ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 203ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 204ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 207ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 208ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 209b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("Unknown operation encryption completed"); 210ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 214b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("enc callback for unknown bd_addr"); 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 220ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gatt_notify_enc_cmpl 221ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 222ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description link encryption complete notification for all encryption process 223ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** initiated outside GATT. 224ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 225ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns 226ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 227ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 228ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid gatt_notify_enc_cmpl(BD_ADDR bd_addr) 229ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 230ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGATT_TCB *p_tcb; 231ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGATT_PENDING_ENC_CLCB *p_buf; 232ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 count; 2337051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu UINT8 i = 0; 234ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2358fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if ((p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE)) != NULL) 236ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2377051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu for (i = 0; i < GATT_MAX_APPS; i++) 2387051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu { 2397051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu if (gatt_cb.cl_rcb[i].in_use && gatt_cb.cl_rcb[i].app_cb.p_enc_cmpl_cb) 2407051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu { 2417051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu (*gatt_cb.cl_rcb[i].app_cb.p_enc_cmpl_cb)(gatt_cb.cl_rcb[i].gatt_if, bd_addr); 2427051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu } 2437051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu } 2447051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu 245ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (gatt_get_sec_act(p_tcb) == GATT_SEC_ENC_PENDING) 246ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 247ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_set_sec_act(p_tcb, GATT_SEC_NONE); 248ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 249ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta count = p_tcb->pending_enc_clcb.count; 250ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 251ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (; count > 0; count --) 252ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 253ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_buf = (tGATT_PENDING_ENC_CLCB *)GKI_dequeue (&p_tcb->pending_enc_clcb)) != NULL) 254ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 255ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_security_check_start(p_buf->p_clcb); 256ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_freebuf(p_buf); 257ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 258ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 259ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 260ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 261ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 262ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 263ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 264ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 265b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("notify GATT for encryption completion of unknown device"); 266ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 267ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 268ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 269ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 270ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_set_sec_act 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function set the sec_act in clcb 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_set_sec_act(tGATT_TCB *p_tcb, tGATT_SEC_ACTION sec_act) 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb) 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->sec_act = sec_act; 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_get_sec_act 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function get the sec_act in clcb 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_SEC_ACTION gatt_get_sec_act(tGATT_TCB *p_tcb) 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SEC_ACTION sec_act = GATT_SEC_NONE; 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb) 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_act = p_tcb->sec_act; 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return sec_act; 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_determine_sec_act 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This routine determine the security action based on auth_request and 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** current link status 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns tGATT_SEC_ACTION security action 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_SEC_ACTION gatt_determine_sec_act(tGATT_CLCB *p_clcb ) 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SEC_ACTION act = GATT_SEC_OK; 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 sec_flag; 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb = p_clcb->p_tcb; 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_AUTH_REQ auth_req = p_clcb->auth_req; 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_link_encrypted= FALSE; 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_link_key_known=FALSE; 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_key_mitm=FALSE; 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 key_type; 323ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_BLE_SEC_REQ_ACT sec_act = BTM_LE_SEC_NONE; 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (auth_req == GATT_AUTH_REQ_NONE ) 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return act; 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3288fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta BTM_GetSecurityFlagsByTransport(p_tcb->peer_bda, &sec_flag, p_clcb->p_tcb->transport); 3298fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta 330ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btm_ble_link_sec_check(p_tcb->peer_bda, auth_req, &sec_act); 331ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 332ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* if a encryption is pending, need to wait */ 333ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (sec_act == BTM_BLE_SEC_REQ_ACT_DISCARD && 334ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta auth_req != GATT_AUTH_REQ_NONE) 335ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return GATT_SEC_ENC_PENDING; 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3378fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if (sec_flag & (BTM_SEC_FLAG_ENCRYPTED| BTM_SEC_FLAG_LKEY_KNOWN)) 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3398fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if (sec_flag & BTM_SEC_FLAG_ENCRYPTED) 3408fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta is_link_encrypted = TRUE; 341ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_link_key_known = TRUE; 3438fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED) 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_key_mitm = TRUE; 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* first check link key upgrade required or not */ 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (auth_req) 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_AUTH_REQ_MITM: 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_AUTH_REQ_SIGNED_MITM: 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!is_key_mitm) 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project act = GATT_SEC_ENCRYPT_MITM; 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_AUTH_REQ_NO_MITM: 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_AUTH_REQ_SIGNED_NO_MITM: 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!is_link_key_known) 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project act = GATT_SEC_ENCRYPT_NO_MITM; 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* now check link needs to be encrypted or not if the link key upgrade is not required */ 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (act == GATT_SEC_OK) 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3698fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if (p_tcb->transport == BT_TRANSPORT_LE && 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_clcb->operation == GATTC_OPTYPE_WRITE) && 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_clcb->op_subtype == GATT_WRITE_NO_RSP)) 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this is a write command request 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project check data signing required or not */ 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!is_link_encrypted) 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_ble_get_enc_key_type(p_tcb->peer_bda, &key_type); 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (key_type & BTM_LE_KEY_LCSRK) && 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((auth_req == GATT_AUTH_REQ_SIGNED_NO_MITM) || 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (auth_req == GATT_AUTH_REQ_SIGNED_MITM))) 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project act = GATT_SEC_SIGN_DATA; 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project act = GATT_SEC_ENCRYPT; 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!is_link_encrypted) 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project act = GATT_SEC_ENCRYPT; 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return act ; 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_get_link_encrypt_status 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This routine get the encryption status of the specified link 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns tGATT_STATUS link encryption status 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS gatt_get_link_encrypt_status(tGATT_TCB *p_tcb) 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS encrypt_status = GATT_NOT_ENCRYPTED; 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 sec_flag=0; 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4228fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta BTM_GetSecurityFlagsByTransport(p_tcb->peer_bda, &sec_flag, p_tcb->transport); 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((sec_flag & BTM_SEC_FLAG_ENCRYPTED) && (sec_flag & BTM_SEC_FLAG_LKEY_KNOWN)) 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project encrypt_status = GATT_ENCRYPED_NO_MITM; 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED) 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project encrypt_status = GATT_ENCRYPED_MITM; 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 431b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_get_link_encrypt_status status=0x%x",encrypt_status); 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return encrypt_status ; 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_convert_sec_action 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Convert GATT security action enum into equivalent BTM BLE security action enum 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BOOLEAN TRUE - conversation is successful 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN gatt_convert_sec_action(tGATT_SEC_ACTION gatt_sec_act, tBTM_BLE_SEC_ACT *p_btm_sec_act ) 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status = TRUE; 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (gatt_sec_act) 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_SEC_ENCRYPT: 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_btm_sec_act = BTM_BLE_SEC_ENCRYPT; 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_SEC_ENCRYPT_NO_MITM: 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_btm_sec_act = BTM_BLE_SEC_ENCRYPT_NO_MITM; 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_SEC_ENCRYPT_MITM: 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_btm_sec_act = BTM_BLE_SEC_ENCRYPT_MITM; 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = FALSE; 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_check_enc_req 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description check link security. 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if encrypted, otherwise FALSE. 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_security_check_start(tGATT_CLCB *p_clcb) 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb = p_clcb->p_tcb; 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SEC_ACTION gatt_sec_act; 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_BLE_SEC_ACT btm_ble_sec_act; 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status = TRUE; 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS btm_status; 482ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGATT_SEC_ACTION sec_act_old = gatt_get_sec_act(p_tcb); 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 484ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_sec_act = gatt_determine_sec_act(p_clcb); 485ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 486ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (sec_act_old == GATT_SEC_NONE) 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_set_sec_act(p_tcb, gatt_sec_act); 488ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 489ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta switch (gatt_sec_act ) 490ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 491ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case GATT_SEC_SIGN_DATA: 492b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_security_check_start: Do data signing"); 493ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_sign_data(p_clcb); 494ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 495ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case GATT_SEC_ENCRYPT: 496ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case GATT_SEC_ENCRYPT_NO_MITM: 497ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case GATT_SEC_ENCRYPT_MITM: 498ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (sec_act_old < GATT_SEC_ENCRYPT) 499ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 500b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_security_check_start: Encrypt now or key upgreade first"); 501ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_convert_sec_action(gatt_sec_act, &btm_ble_sec_act); 5028fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta btm_status = BTM_SetEncryption(p_tcb->peer_bda, p_tcb->transport , gatt_enc_cmpl_cback, &btm_ble_sec_act); 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_status != BTM_SUCCESS) && (btm_status != BTM_CMD_STARTED)) 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 505b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("gatt_security_check_start BTM_SetEncryption failed btm_status=%d", btm_status); 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = FALSE; 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 508ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 509ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (status) 510ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_add_pending_enc_channel_clcb (p_tcb, p_clcb); 511ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 512ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case GATT_SEC_ENC_PENDING: 513ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_add_pending_enc_channel_clcb (p_tcb, p_clcb); 514ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* wait for link encrypotion to finish */ 515ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 516ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta default: 517ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_sec_check_complete(TRUE, p_clcb, gatt_sec_act); 518ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 520ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 521ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (status == FALSE) 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 523ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_set_sec_act(p_tcb, GATT_SEC_NONE); 524ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_set_ch_state(p_tcb, GATT_CH_OPEN); 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BLE_INCLUDED */ 532