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