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