15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2008-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 the implementation of the SMP interface used by
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  applications that can run over an SMP.
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
285cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h"
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "smp_int.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "smp_api.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "l2cdefs.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "l2c_int.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "btm_int.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "hcimsgs.h"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "btu.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SMP_Init
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function initializes the SMP unit.
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid SMP_Init(void)
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT ("SMP_Init");
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&smp_cb, 0, sizeof(tSMP_CB));
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(SMP_INITIAL_TRACE_LEVEL)
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_cb.trace_level = SMP_INITIAL_TRACE_LEVEL;
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_cb.trace_level = BT_TRACE_LEVEL_NONE;    /* No traces */
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_l2cap_if_init();
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SMP_SetTraceLevel
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sets the trace level for SMP.  If called with
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a value of 0xFF, it simply returns the current trace level.
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Input Parameters:
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      level:  The level to set the GATT tracing to:
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      0xff-returns the current setting.
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      0-turns off tracing.
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      >= 1-Errors.
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      >= 2-Warnings.
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      >= 3-APIs.
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      >= 4-Events.
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      >= 5-Debug.
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          The new or current trace level
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectSMP_API extern UINT8 SMP_SetTraceLevel (UINT8 new_level)
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (new_level != 0xFF)
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_cb.trace_level = new_level;
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(smp_cb.trace_level);
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SMP_Register
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function register for the SMP services callback.
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SMP_Register (tSMP_CALLBACK *p_cback)
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
105b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT ("SMP_Register state=%d", smp_cb.state);
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (smp_cb.p_callback != NULL)
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
109b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_ERROR ("SMP_Register: duplicate registration, overwrite it");
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_cb.p_callback = p_cback;
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SMP_Pair
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function call to perform a SMP pairing with peer device.
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Device support one SMP pairing at one time.
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       bd_addr - peer device bd address.
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttSMP_STATUS SMP_Pair (BD_ADDR bd_addr)
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_CB   *p_cb = &smp_cb;
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8     status = SMP_PAIR_INTERNAL_ERR;
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13483c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati    BTM_TRACE_EVENT ("SMP_Pair state=%d flag=0x%x ", p_cb->state, p_cb->flags);
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->state != SMP_ST_IDLE || p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* pending security on going, reject this one */
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return SMP_BUSY;
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->flags = SMP_PAIR_FLAGS_WE_STARTED_DD;
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_cb->pairing_bda, bd_addr, BD_ADDR_LEN);
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!L2CA_ConnectFixedChnl (L2CAP_SMP_CID, bd_addr))
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
148b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            SMP_TRACE_ERROR("SMP_Pair: L2C connect fixed channel failed.");
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return status;
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return SMP_STARTED;
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SMP_PairCancel
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function call to cancel a SMP pairing with peer device.
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       bd_addr - peer device bd address.
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE - Pairining is cancelled
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SMP_PairCancel (BD_ADDR bd_addr)
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_CB   *p_cb = &smp_cb;
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8     err_code = SMP_PAIR_FAIL_UNKNOWN;
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN   status = FALSE;
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17583c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati    BTM_TRACE_EVENT ("SMP_CancelPair state=%d flag=0x%x ", p_cb->state, p_cb->flags);
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_cb->state != SMP_ST_IDLE)  &&
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         (!memcmp (p_cb->pairing_bda, bd_addr, BD_ADDR_LEN)) )
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->is_pair_cancel = TRUE;
180b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_DEBUG("Cancel Pairing: set fail reason Unknown");
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &err_code);
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = TRUE;
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SMP_SecurityGrant
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to grant security process.
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       bd_addr - peer device bd address.
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  res     - result of the operation SMP_SUCCESS if success.
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                            Otherwise, SMP_REPEATED_ATTEMPTS is too many attempts.
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid SMP_SecurityGrant(BD_ADDR bd_addr, UINT8 res)
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
202b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT ("SMP_SecurityGrant ");
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (smp_cb.state != SMP_ST_WAIT_APP_RSP ||
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_cb.cb_evt != SMP_SEC_REQUEST_EVT ||
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcmp (smp_cb.pairing_bda, bd_addr, BD_ADDR_LEN))
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
208503a55007c7fa7769e3e03cb8d7858e32dec7ba4Zhihai Xu    /* clear the SMP_SEC_REQUEST_EVT event after get grant */
209503a55007c7fa7769e3e03cb8d7858e32dec7ba4Zhihai Xu    /* avoid generate duplicate pair request */
210503a55007c7fa7769e3e03cb8d7858e32dec7ba4Zhihai Xu    smp_cb.cb_evt = 0;
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_sm_event(&smp_cb, SMP_API_SEC_GRANT_EVT, &res);
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SMP_PasskeyReply
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called after Security Manager submitted
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  passkey request to the application.
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the device for which passkey was requested
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  res          - result of the operation SMP_SUCCESS if success
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  passkey - numeric value in the range of
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)).
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid SMP_PasskeyReply (BD_ADDR bd_addr, UINT8 res, UINT32 passkey)
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_CB *p_cb = & smp_cb;
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   failure = SMP_PASSKEY_ENTRY_FAIL;
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
233b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT ("SMP_PasskeyReply: Key: %d  Result:%d",
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      passkey, res);
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->cb_evt != SMP_PASSKEY_REQ_EVT)
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
239b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_WARNING ("SMP_PasskeyReply() - Wrong State: %d", p_cb->state);
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (memcmp (bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) != 0)
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
245b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_ERROR ("SMP_PasskeyReply() - Wrong BD Addr");
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
251b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_ERROR ("SMP_PasskeyReply() - no dev CB");
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (passkey > BTM_MAX_PASSKEY_VAL || res != SMP_SUCCESS)
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
258b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_WARNING ("SMP_PasskeyReply() - Wrong key len: %d or passkey entry fail", passkey);
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* send pairing failure */
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure);
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_convert_string_to_tk(p_cb->tk, passkey);
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SMP_OobDataReply
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to provide the OOB data for
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  SMP in response to SMP_OOB_REQ_EVT
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr     - Address of the peer device
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  res         - result of the operation SMP_SUCCESS if success
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_data      - simple pairing Randomizer  C.
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid SMP_OobDataReply(BD_ADDR bd_addr, tSMP_STATUS res, UINT8 len, UINT8 *p_data)
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_CB *p_cb = & smp_cb;
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   failure = SMP_OOB_FAIL;
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_KEY        key;
2885cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(bd_addr);
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
290b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT ("SMP_OobDataReply State: %d  res:%d",
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      smp_cb.state, res);
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->state != SMP_ST_WAIT_APP_RSP || p_cb->cb_evt != SMP_OOB_REQ_EVT)
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (res != SMP_SUCCESS || len == 0 || !p_data)
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure);
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (len > BT_OCTET16_LEN)
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len = BT_OCTET16_LEN;
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(p_cb->tk, p_data, len);
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        key.key_type    = SMP_KEY_TYPE_TK;
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        key.p_data      = p_cb->tk;
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_sm_event(&smp_cb, SMP_KEY_READY_EVT, &key);
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         SMP_Encrypt
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to encrypt the data with the specified
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  key
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      key                 - Pointer to key key[0] conatins the MSB
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  key_len             - key length
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  plain_text          - Pointer to data to be encrypted
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                        plain_text[0] conatins the MSB
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  pt_len              - plain text length
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_out                - output of the encrypted texts
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Returns         Boolean - request is successful
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SMP_Encrypt (UINT8 *key, UINT8 key_len,
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     UINT8 *plain_text, UINT8 pt_len,
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     tSMP_ENC *p_out)
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN status=FALSE;
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = smp_encrypt_data(key, key_len, plain_text, pt_len, p_out);
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* SMP_INCLUDED */
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
343