1/******************************************************************************
2 *
3 *  Copyright (C) 1999-2012 Broadcom Corporation
4 *
5 *  Licensed under the Apache License, Version 2.0 (the "License");
6 *  you may not use this file except in compliance with the License.
7 *  You may obtain a copy of the License at:
8 *
9 *  http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 *
17 ******************************************************************************/
18
19/******************************************************************************
20 *
21 *  This file contains the SMP API function external definitions.
22 *
23 ******************************************************************************/
24#ifndef SMP_API_H
25#define SMP_API_H
26
27#include "bt_target.h"
28
29#define SMP_PIN_CODE_LEN_MAX    PIN_CODE_LEN
30#define SMP_PIN_CODE_LEN_MIN    6
31
32/* SMP event type */
33#define SMP_IO_CAP_REQ_EVT      1       /* IO capability request event */
34#define SMP_SEC_REQUEST_EVT     2       /* SMP pairing request */
35#define SMP_PASSKEY_NOTIF_EVT   3       /* passkey notification event */
36#define SMP_PASSKEY_REQ_EVT     4       /* passkey request event */
37#define SMP_OOB_REQ_EVT         5       /* OOB request event */
38#define SMP_COMPLT_EVT          6       /* SMP complete event */
39typedef UINT8   tSMP_EVT;
40
41
42/* pairing failure reason code */
43#define SMP_PASSKEY_ENTRY_FAIL      0x01
44#define SMP_OOB_FAIL                0x02
45#define SMP_PAIR_AUTH_FAIL          0x03
46#define SMP_CONFIRM_VALUE_ERR       0x04
47#define SMP_PAIR_NOT_SUPPORT        0x05
48#define SMP_ENC_KEY_SIZE            0x06
49#define SMP_INVALID_CMD             0x07
50#define SMP_PAIR_FAIL_UNKNOWN       0x08
51#define SMP_REPEATED_ATTEMPTS       0x09
52#define SMP_PAIR_FAILURE_MAX        SMP_REPEATED_ATTEMPTS
53/* self defined error code */
54#define SMP_PAIR_INTERNAL_ERR       0x0A
55#define SMP_UNKNOWN_IO_CAP          0x0B    /* unknown IO capability, unable to decide associatino model */
56#define SMP_INIT_FAIL               0x0C
57#define SMP_CONFIRM_FAIL            0x0D
58#define SMP_BUSY                    0x0E
59#define SMP_ENC_FAIL                0x0F
60#define SMP_STARTED                 0x10
61#define SMP_RSP_TIMEOUT             0x11
62#define SMP_DIV_NOT_AVAIL           0x12
63#define SMP_FAIL                    0x13 /* unspecified failed reason */
64#define SMP_CONN_TOUT               0x14 /* unspecified failed reason */
65#define SMP_SUCCESS                 0
66
67typedef UINT8 tSMP_STATUS;
68
69
70/* Device IO capability */
71#define SMP_IO_CAP_OUT      BTM_IO_CAP_OUT   /* DisplayOnly */
72#define SMP_IO_CAP_IO       BTM_IO_CAP_IO   /* DisplayYesNo */
73#define SMP_IO_CAP_IN       BTM_IO_CAP_IN   /* KeyboardOnly */
74#define SMP_IO_CAP_NONE     BTM_IO_CAP_NONE   /* NoInputNoOutput */
75#define SMP_IO_CAP_KBDISP   BTM_IO_CAP_KBDISP   /* Keyboard Display */
76#define SMP_IO_CAP_MAX      BTM_IO_CAP_MAX
77typedef UINT8  tSMP_IO_CAP;
78
79#ifndef SMP_DEFAULT_IO_CAPS
80    #define SMP_DEFAULT_IO_CAPS     SMP_IO_CAP_KBDISP
81#endif
82
83/* OOB data present or not */
84enum
85{
86    SMP_OOB_NONE,
87    SMP_OOB_PRESENT,
88    SMP_OOB_UNKNOWN
89};
90typedef UINT8  tSMP_OOB_FLAG;
91
92#define SMP_AUTH_NO_BOND        0x00
93#define SMP_AUTH_GEN_BOND       0x01 //todo sdh change GEN_BOND to BOND
94
95/* SMP Authentication requirement */
96#define SMP_AUTH_YN_BIT           (1 << 2)
97#define SMP_AUTH_MASK           (SMP_AUTH_GEN_BOND|SMP_AUTH_YN_BIT)
98
99
100#define SMP_AUTH_BOND           SMP_AUTH_GEN_BOND
101
102#define SMP_AUTH_NB_ENC_ONLY    0x00 //(SMP_AUTH_MASK | BTM_AUTH_SP_NO)   /* no MITM, No Bonding, Encryptino only */
103#define SMP_AUTH_NB_IOCAP       (SMP_AUTH_NO_BOND | SMP_AUTH_YN_BIT)   /* MITM, No Bonding, Use IO Capability
104                                        to detrermine authenticaion procedure */
105#define SMP_AUTH_GB_ENC_ONLY    (SMP_AUTH_GEN_BOND )   /* no MITM, General Bonding, Encryptino only */
106#define SMP_AUTH_GB_IOCAP       (SMP_AUTH_GEN_BOND | SMP_AUTH_YN_BIT)  /* MITM, General Bonding, Use IO Capability
107                                        to detrermine authenticaion procedure   */
108typedef UINT8 tSMP_AUTH_REQ;
109
110#define SMP_SEC_NONE                 0
111#define SMP_SEC_UNAUTHENTICATE      (1 << 0)
112#define SMP_SEC_AUTHENTICATED       (1 << 2)
113typedef UINT8 tSMP_SEC_LEVEL;
114
115/* SMP key types */
116#define SMP_SEC_KEY_TYPE_ENC                (1 << 0)    /* encryption key */
117#define SMP_SEC_KEY_TYPE_ID                 (1 << 1)    /* identity key */
118#define SMP_SEC_KEY_TYPE_CSRK               (1 << 2)    /* slave CSRK */
119typedef UINT8 tSMP_KEYS;
120
121/* default security key distribution value */
122#define SMP_SEC_DEFAULT_KEY                  (SMP_SEC_KEY_TYPE_ENC | SMP_SEC_KEY_TYPE_ID | SMP_SEC_KEY_TYPE_CSRK)
123
124/* data type for BTM_SP_IO_REQ_EVT */
125typedef struct
126{
127    tSMP_IO_CAP     io_cap;         /* local IO capabilities */
128    tSMP_OOB_FLAG   oob_data;       /* OOB data present (locally) for the peer device */
129    tSMP_AUTH_REQ   auth_req;       /* Authentication required (for local device) */
130    UINT8           max_key_size;   /* max encryption key size */
131    tSMP_KEYS       init_keys;      /* initiator keys to be distributed */
132    tSMP_KEYS       resp_keys;      /* responder keys */
133} tSMP_IO_REQ;
134
135typedef struct
136{
137    UINT8       reason;
138    UINT8       sec_level;
139    BOOLEAN     is_pair_cancel;
140} tSMP_CMPL;
141
142typedef union
143{
144    UINT32          passkey;
145    tSMP_IO_REQ     io_req;     /* IO request */
146    tSMP_CMPL       cmplt;
147
148}tSMP_EVT_DATA;
149
150
151/* AES Encryption output */
152typedef struct
153{
154    UINT8   status;
155    UINT8   param_len;
156    UINT16  opcode;
157    UINT8   param_buf[BT_OCTET16_LEN];
158} tSMP_ENC;
159
160/* Simple Pairing Events.  Called by the stack when Simple Pairing related
161** events occur.
162*/
163typedef UINT8 (tSMP_CALLBACK) (tSMP_EVT event, BD_ADDR bd_addr, tSMP_EVT_DATA *p_data);
164
165/* callback function for CMAC algorithm
166*/
167typedef void (tCMAC_CMPL_CBACK)(UINT8 *p_mac, UINT16 tlen, UINT32 sign_counter);
168
169/*****************************************************************************
170**  External Function Declarations
171*****************************************************************************/
172#ifdef __cplusplus
173extern "C"
174{
175#endif
176/* API of SMP */
177
178/*******************************************************************************
179**
180** Function         SMP_Init
181**
182** Description      This function initializes the SMP unit.
183**
184** Returns          void
185**
186*******************************************************************************/
187    SMP_API extern void SMP_Init(void);
188
189/*******************************************************************************
190**
191** Function         SMP_SetTraceLevel
192**
193** Description      This function sets the trace level for SMP.  If called with
194**                  a value of 0xFF, it simply returns the current trace level.
195**
196** Returns          The new or current trace level
197**
198*******************************************************************************/
199    SMP_API extern UINT8 SMP_SetTraceLevel (UINT8 new_level);
200
201/*******************************************************************************
202**
203** Function         SMP_Register
204**
205** Description      This function register for the SMP service callback.
206**
207** Returns          void
208**
209*******************************************************************************/
210    SMP_API extern BOOLEAN SMP_Register (tSMP_CALLBACK *p_cback);
211
212/*******************************************************************************
213**
214** Function         SMP_Pair
215**
216** Description      This function is called to start a SMP pairing.
217**
218** Returns          SMP_STARTED if bond started, else otherwise exception.
219**
220*******************************************************************************/
221    SMP_API extern tSMP_STATUS SMP_Pair (BD_ADDR bd_addr);
222/*******************************************************************************
223**
224** Function         SMP_PairCancel
225**
226** Description      This function is called to cancel a SMP pairing.
227**
228** Returns          TRUE - pairing cancelled
229**
230*******************************************************************************/
231    SMP_API extern  BOOLEAN SMP_PairCancel (BD_ADDR bd_addr);
232
233/*******************************************************************************
234**
235** Function         SMP_SecurityGrant
236**
237** Description      This function is called to grant security process.
238**
239** Parameters       bd_addr - peer device bd address.
240**                  res     - result of the operation SMP_SUCCESS if success.
241**                            Otherwise, SMP_REPEATED_ATTEMPTS is too many attempts.
242**
243** Returns          None
244**
245*******************************************************************************/
246    SMP_API extern void SMP_SecurityGrant(BD_ADDR bd_addr, UINT8 res);
247
248/*******************************************************************************
249**
250** Function         SMP_PasskeyReply
251**
252** Description      This function is called after Security Manager submitted
253**                  Passkey request to the application.
254**
255** Parameters:      bd_addr      - Address of the device for which PIN was requested
256**                  res          - result of the operation BTM_SUCCESS if success
257**                  passkey      - numeric value in the range of
258**                  BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)).
259**
260*******************************************************************************/
261    SMP_API extern void SMP_PasskeyReply (BD_ADDR bd_addr, UINT8 res, UINT32 passkey);
262
263/*******************************************************************************
264**
265** Function         SMP_OobDataReply
266**
267** Description      This function is called to provide the OOB data for
268**                  Simple Pairing in response to BTM_SP_RMT_OOB_EVT
269**
270** Parameters:      bd_addr     - Address of the peer device
271**                  res         - result of the operation SMP_SUCCESS if success
272**                  p_data      - simple pairing Randomizer  C.
273**
274*******************************************************************************/
275    SMP_API extern void SMP_OobDataReply(BD_ADDR bd_addr, tSMP_STATUS res, UINT8 len,
276                                         UINT8 *p_data);
277
278/*******************************************************************************
279**
280** Function         SMP_Encrypt
281**
282** Description      This function is called to encrypt the data with the specified
283**                  key
284**
285** Parameters:      key                 - Pointer to key key[0] conatins the MSB
286**                  key_len             - key length
287**                  plain_text          - Pointer to data to be encrypted
288**                                        plain_text[0] conatins the MSB
289**                  pt_len              - plain text length
290**                  p_out               - pointer to the encrypted outputs
291**
292**  Returns         Boolean - TRUE: encryption is successful
293*******************************************************************************/
294    SMP_API extern BOOLEAN SMP_Encrypt (UINT8 *key, UINT8 key_len,
295                                        UINT8 *plain_text, UINT8 pt_len,
296                                        tSMP_ENC *p_out);
297
298#ifdef __cplusplus
299}
300#endif
301#endif /* SMP_API_H */
302