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