smp_api.c revision e448862a47c08eb23185aaed574b39264f5005fc
1e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*****************************************************************************
2e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
3e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**  Name:           smp_api.c
4e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
5e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**  Description:    This file contains the implementation of the SMP
6e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  interface used by applications that can run over an SMP.
7e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
8e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
9e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**  Copyright (c) 2008-2009, Broadcom Corp., All Rights Reserved.
10e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**  Broadcom Bluetooth Core. Proprietary and confidential.
11e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach******************************************************************************/
12e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <string.h>
13e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
14e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bt_target.h"
15e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if SMP_INCLUDED == TRUE
16e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    #include "smp_int.h"
17e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    #include "smp_api.h"
18e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    #include "l2cdefs.h"
19e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    #include "l2c_int.h"
20e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    #include "btm_int.h"
21e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    #include "hcimsgs.h"
22e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
23e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    #include "btu.h"
24e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
25e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
28e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         SMP_Init
29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function initializes the SMP unit.
31e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
32e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
33e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
34e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
35e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid SMP_Init(void)
36e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
37e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    SMP_TRACE_EVENT0 ("SMP_Init");
39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memset(&smp_cb, 0, sizeof(tSMP_CB));
40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if defined(SMP_INITIAL_TRACE_LEVEL)
42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    smp_cb.trace_level = SMP_INITIAL_TRACE_LEVEL;
43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    smp_cb.trace_level = BT_TRACE_LEVEL_NONE;    /* No traces */
45e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    smp_l2cap_if_init();
48e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
49e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
50e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
51e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
53e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         SMP_SetTraceLevel
54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function sets the trace level for SMP.  If called with
56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  a value of 0xFF, it simply returns the current trace level.
57e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  Input Parameters:
59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                      level:  The level to set the GATT tracing to:
60e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                      0xff-returns the current setting.
61e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                      0-turns off tracing.
62e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                      >= 1-Errors.
63e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                      >= 2-Warnings.
64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                      >= 3-APIs.
65e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                      >= 4-Events.
66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                      >= 5-Debug.
67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
68e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          The new or current trace level
69e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
71e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachSMP_API extern UINT8 SMP_SetTraceLevel (UINT8 new_level)
72e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (new_level != 0xFF)
74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        smp_cb.trace_level = new_level;
75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
76e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return(smp_cb.trace_level);
77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
81e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         SMP_Register
83e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
84e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function register for the SMP services callback.
85e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
86e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
87e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
88e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
89e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachBOOLEAN SMP_Register (tSMP_CALLBACK *p_cback)
90e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
91e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    SMP_TRACE_EVENT1 ("SMP_Register state=%d", smp_cb.state);
92e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
93e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (smp_cb.p_callback != NULL)
94e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        SMP_TRACE_ERROR0 ("SMP_Register: duplicate registration, overwrite it");
96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    smp_cb.p_callback = p_cback;
98e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
99e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return(TRUE);
100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         SMP_Pair
106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function call to perform a SMP pairing with peer device.
108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  Device support one SMP pairing at one time.
109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters       bd_addr - peer device bd address.
111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          None
113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
115e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtSMP_STATUS SMP_Pair (BD_ADDR bd_addr)
116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSMP_CB   *p_cb = &smp_cb;
118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8     status = SMP_PAIR_INTERNAL_ERR;
119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTM_TRACE_EVENT2 ("SMP_Pair state=%d flag=0x%x ", p_cb->state, p_cb->flags);
121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_cb->state != SMP_ST_IDLE || p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)
122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* pending security on going, reject this one */
124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return SMP_BUSY;
125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_cb->flags = SMP_PAIR_FLAGS_WE_STARTED_DD;
129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        memcpy (p_cb->pairing_bda, bd_addr, BD_ADDR_LEN);
131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (!L2CA_ConnectFixedChnl (L2CAP_SMP_CID, bd_addr))
133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            SMP_TRACE_ERROR0("SMP_Pair: L2C connect fixed channel failed.");
135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return status;
137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return SMP_STARTED;
140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         SMP_PairCancel
147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function call to cancel a SMP pairing with peer device.
149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters       bd_addr - peer device bd address.
151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          TRUE - Pairining is cancelled
153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
155e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachBOOLEAN SMP_PairCancel (BD_ADDR bd_addr)
156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSMP_CB   *p_cb = &smp_cb;
158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8     err_code = SMP_PAIR_FAIL_UNKNOWN;
159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BOOLEAN   status = FALSE;
160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTM_TRACE_EVENT2 ("SMP_CancelPair state=%d flag=0x%x ", p_cb->state, p_cb->flags);
162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ( (p_cb->state != SMP_ST_IDLE)  &&
163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach         (!memcmp (p_cb->pairing_bda, bd_addr, BD_ADDR_LEN)) )
164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_cb->is_pair_cancel = TRUE;
166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        SMP_TRACE_DEBUG0("Cancel Pairing: set fail reason Unknown");
167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &err_code);
168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        status = TRUE;
169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return status;
172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         SMP_SecurityGrant
176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called to grant security process.
178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters       bd_addr - peer device bd address.
180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  res     - result of the operation SMP_SUCCESS if success.
181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                            Otherwise, SMP_REPEATED_ATTEMPTS is too many attempts.
182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          None
184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid SMP_SecurityGrant(BD_ADDR bd_addr, UINT8 res)
187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    SMP_TRACE_EVENT0 ("SMP_SecurityGrant ");
189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (smp_cb.state != SMP_ST_WAIT_APP_RSP ||
190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        smp_cb.cb_evt != SMP_SEC_REQUEST_EVT ||
191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        memcmp (smp_cb.pairing_bda, bd_addr, BD_ADDR_LEN))
192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    smp_sm_event(&smp_cb, SMP_API_SEC_GRANT_EVT, &res);
195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         SMP_PasskeyReply
200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called after Security Manager submitted
202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  passkey request to the application.
203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters:      bd_addr      - Address of the device for which passkey was requested
205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  res          - result of the operation SMP_SUCCESS if success
206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  passkey - numeric value in the range of
207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)).
208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid SMP_PasskeyReply (BD_ADDR bd_addr, UINT8 res, UINT32 passkey)
211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSMP_CB *p_cb = & smp_cb;
213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8   failure = SMP_PASSKEY_ENTRY_FAIL;
214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTM_SEC_DEV_REC *p_dev_rec;
215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    SMP_TRACE_EVENT2 ("SMP_PasskeyReply: Key: %d  Result:%d",
217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                      passkey, res);
218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If timeout already expired or has been canceled, ignore the reply */
220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_cb->cb_evt != SMP_PASSKEY_REQ_EVT)
221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        SMP_TRACE_WARNING1 ("SMP_PasskeyReply() - Wrong State: %d", p_cb->state);
223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (memcmp (bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) != 0)
227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        SMP_TRACE_ERROR0 ("SMP_PasskeyReply() - Wrong BD Addr");
229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        SMP_TRACE_ERROR0 ("SMP_PasskeyReply() - no dev CB");
235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (passkey > BTM_MAX_PASSKEY_VAL || res != SMP_SUCCESS)
240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        SMP_TRACE_WARNING1 ("SMP_PasskeyReply() - Wrong key len: %d or passkey entry fail", passkey);
242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* send pairing failure */
243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure);
244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        smp_convert_string_to_tk(p_cb->tk, passkey);
249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return;
252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         SMP_OobDataReply
257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called to provide the OOB data for
259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  SMP in response to SMP_OOB_REQ_EVT
260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters:      bd_addr     - Address of the peer device
262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  res         - result of the operation SMP_SUCCESS if success
263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  p_data      - simple pairing Randomizer  C.
264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid SMP_OobDataReply(BD_ADDR bd_addr, tSMP_STATUS res, UINT8 len, UINT8 *p_data)
267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSMP_CB *p_cb = & smp_cb;
269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8   failure = SMP_OOB_FAIL;
270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSMP_KEY        key;
271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    SMP_TRACE_EVENT2 ("SMP_OobDataReply State: %d  res:%d",
273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                      smp_cb.state, res);
274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If timeout already expired or has been canceled, ignore the reply */
276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_cb->state != SMP_ST_WAIT_APP_RSP || p_cb->cb_evt != SMP_OOB_REQ_EVT)
277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (res != SMP_SUCCESS || len == 0 || !p_data)
280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure);
282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (len > BT_OCTET16_LEN)
286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            len = BT_OCTET16_LEN;
287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        memcpy(p_cb->tk, p_data, len);
289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        key.key_type    = SMP_KEY_TYPE_TK;
291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        key.p_data      = p_cb->tk;
292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        smp_sm_event(&smp_cb, SMP_KEY_READY_EVT, &key);
294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         SMP_Encrypt
300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called to encrypt the data with the specified
302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  key
303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters:      key                 - Pointer to key key[0] conatins the MSB
305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  key_len             - key length
306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  plain_text          - Pointer to data to be encrypted
307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                                        plain_text[0] conatins the MSB
308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  pt_len              - plain text length
309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  p_out                - output of the encrypted texts
310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**  Returns         Boolean - request is successful
312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
313e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachBOOLEAN SMP_Encrypt (UINT8 *key, UINT8 key_len,
314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                     UINT8 *plain_text, UINT8 pt_len,
315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                     tSMP_ENC *p_out)
316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BOOLEAN status=FALSE;
319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    status = smp_encrypt_data(key, key_len, plain_text, pt_len, p_out);
320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return status;
321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif /* SMP_INCLUDED */
323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
325