smp_api.h revision 444a8da807abaf5f9e813ce70c56a79160495fb3
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#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
33/* SMP command code */
34#define SMP_OPCODE_PAIRING_REQ            0x01
35#define SMP_OPCODE_PAIRING_RSP            0x02
36#define SMP_OPCODE_CONFIRM                0x03
37#define SMP_OPCODE_RAND                   0x04
38#define SMP_OPCODE_PAIRING_FAILED         0x05
39#define SMP_OPCODE_ENCRYPT_INFO           0x06
40#define SMP_OPCODE_MASTER_ID              0x07
41#define SMP_OPCODE_IDENTITY_INFO          0x08
42#define SMP_OPCODE_ID_ADDR                0x09
43#define SMP_OPCODE_SIGN_INFO              0x0A
44#define SMP_OPCODE_SEC_REQ                0x0B
45#define SMP_OPCODE_PAIR_PUBLIC_KEY        0x0C
46#define SMP_OPCODE_PAIR_DHKEY_CHECK       0x0D
47#define SMP_OPCODE_PAIR_KEYPR_NOTIF       0x0E
48#define SMP_OPCODE_MAX                    SMP_OPCODE_PAIR_KEYPR_NOTIF
49#define SMP_OPCODE_MIN                    SMP_OPCODE_PAIRING_REQ
50#define SMP_OPCODE_PAIR_COMMITM           0x0F
51#endif
52
53/* SMP event type */
54#define SMP_IO_CAP_REQ_EVT      1       /* IO capability request event */
55#define SMP_SEC_REQUEST_EVT     2       /* SMP pairing request */
56#define SMP_PASSKEY_NOTIF_EVT   3       /* passkey notification event */
57#define SMP_PASSKEY_REQ_EVT     4       /* passkey request event */
58#define SMP_OOB_REQ_EVT         5       /* OOB request event */
59#define SMP_NC_REQ_EVT          6       /* Numeric Comparison request event */
60#define SMP_COMPLT_EVT          7       /* SMP complete event */
61#define SMP_PEER_KEYPR_NOT_EVT  8       /* Peer keypress notification received event */
62#define SMP_SC_OOB_REQ_EVT      9       /* SC OOB request event (both local and peer OOB data */
63                                        /* can be expected in response) */
64#define SMP_SC_LOC_OOB_DATA_UP_EVT  10  /* SC OOB local data set is created */
65                                        /* (as result of SMP_CrLocScOobData(...)) */
66#define SMP_BR_KEYS_REQ_EVT     12      /* SMP over BR keys request event */
67typedef UINT8   tSMP_EVT;
68
69
70/* pairing failure reason code */
71#define SMP_PASSKEY_ENTRY_FAIL      0x01
72#define SMP_OOB_FAIL                0x02
73#define SMP_PAIR_AUTH_FAIL          0x03
74#define SMP_CONFIRM_VALUE_ERR       0x04
75#define SMP_PAIR_NOT_SUPPORT        0x05
76#define SMP_ENC_KEY_SIZE            0x06
77#define SMP_INVALID_CMD             0x07
78#define SMP_PAIR_FAIL_UNKNOWN       0x08
79#define SMP_REPEATED_ATTEMPTS       0x09
80#define SMP_INVALID_PARAMETERS      0x0A
81#define SMP_DHKEY_CHK_FAIL          0x0B
82#define SMP_NUMERIC_COMPAR_FAIL     0x0C
83#define SMP_BR_PARING_IN_PROGR      0x0D
84#define SMP_XTRANS_DERIVE_NOT_ALLOW 0x0E
85#define SMP_MAX_FAIL_RSN_PER_SPEC   SMP_XTRANS_DERIVE_NOT_ALLOW
86
87/* self defined error code */
88#define SMP_PAIR_INTERNAL_ERR       (SMP_MAX_FAIL_RSN_PER_SPEC + 0x01) /* 0x0E */
89
90/* 0x0F unknown IO capability, unable to decide association model */
91#define SMP_UNKNOWN_IO_CAP          (SMP_MAX_FAIL_RSN_PER_SPEC + 0x02) /* 0x0F */
92
93#define SMP_INIT_FAIL               (SMP_MAX_FAIL_RSN_PER_SPEC + 0x03) /* 0x10 */
94#define SMP_CONFIRM_FAIL            (SMP_MAX_FAIL_RSN_PER_SPEC + 0x04) /* 0x11 */
95#define SMP_BUSY                    (SMP_MAX_FAIL_RSN_PER_SPEC + 0x05) /* 0x12 */
96#define SMP_ENC_FAIL                (SMP_MAX_FAIL_RSN_PER_SPEC + 0x06) /* 0x13 */
97#define SMP_STARTED                 (SMP_MAX_FAIL_RSN_PER_SPEC + 0x07) /* 0x14 */
98#define SMP_RSP_TIMEOUT             (SMP_MAX_FAIL_RSN_PER_SPEC + 0x08) /* 0x15 */
99#define SMP_DIV_NOT_AVAIL           (SMP_MAX_FAIL_RSN_PER_SPEC + 0x09) /* 0x16 */
100
101/* 0x17 unspecified failed reason */
102#define SMP_FAIL                    (SMP_MAX_FAIL_RSN_PER_SPEC + 0x0A) /* 0x17 */
103
104#define SMP_CONN_TOUT               (SMP_MAX_FAIL_RSN_PER_SPEC + 0x0B)
105#define SMP_SUCCESS                 0
106
107typedef UINT8 tSMP_STATUS;
108
109
110/* Device IO capability */
111#define SMP_IO_CAP_OUT      BTM_IO_CAP_OUT   /* DisplayOnly */
112#define SMP_IO_CAP_IO       BTM_IO_CAP_IO   /* DisplayYesNo */
113#define SMP_IO_CAP_IN       BTM_IO_CAP_IN   /* KeyboardOnly */
114#define SMP_IO_CAP_NONE     BTM_IO_CAP_NONE   /* NoInputNoOutput */
115#define SMP_IO_CAP_KBDISP   BTM_IO_CAP_KBDISP   /* Keyboard Display */
116#define SMP_IO_CAP_MAX      BTM_IO_CAP_MAX
117typedef UINT8  tSMP_IO_CAP;
118
119#ifndef SMP_DEFAULT_IO_CAPS
120    #define SMP_DEFAULT_IO_CAPS     SMP_IO_CAP_KBDISP
121#endif
122
123/* OOB data present or not */
124enum
125{
126    SMP_OOB_NONE,
127    SMP_OOB_PRESENT,
128    SMP_OOB_UNKNOWN
129};
130typedef UINT8  tSMP_OOB_FLAG;
131
132/* type of OOB data required from application */
133enum
134{
135    SMP_OOB_INVALID_TYPE,
136    SMP_OOB_PEER,
137    SMP_OOB_LOCAL,
138    SMP_OOB_BOTH
139};
140typedef UINT8   tSMP_OOB_DATA_TYPE;
141
142#define SMP_AUTH_NO_BOND        0x00
143#define SMP_AUTH_GEN_BOND       0x01 //todo sdh change GEN_BOND to BOND
144
145/* SMP Authentication requirement */
146#define SMP_AUTH_YN_BIT         (1 << 2)
147#define SMP_SC_SUPPORT_BIT      (1 << 3)
148#define SMP_KP_SUPPORT_BIT      (1 << 4)
149
150#define SMP_AUTH_MASK    (SMP_AUTH_GEN_BOND|SMP_AUTH_YN_BIT|SMP_SC_SUPPORT_BIT|SMP_KP_SUPPORT_BIT)
151
152#define SMP_AUTH_BOND           SMP_AUTH_GEN_BOND
153
154/* no MITM, No Bonding, encryption only */
155#define SMP_AUTH_NB_ENC_ONLY    0x00 //(SMP_AUTH_MASK | BTM_AUTH_SP_NO)
156
157/* MITM, No Bonding, Use IO Capability to determine authentication procedure */
158#define SMP_AUTH_NB_IOCAP       (SMP_AUTH_NO_BOND | SMP_AUTH_YN_BIT)
159
160/* No MITM, General Bonding, Encryption only */
161#define SMP_AUTH_GB_ENC_ONLY    (SMP_AUTH_GEN_BOND )
162
163/* MITM, General Bonding, Use IO Capability to determine authentication procedure */
164#define SMP_AUTH_GB_IOCAP       (SMP_AUTH_GEN_BOND | SMP_AUTH_YN_BIT)
165
166/* Secure Connections, no MITM, no Bonding */
167#define SMP_AUTH_SC_ENC_ONLY    (SMP_SC_SUPPORT_BIT)
168
169/* Secure Connections, no MITM, Bonding */
170#define SMP_AUTH_SC_GB          (SMP_SC_SUPPORT_BIT | SMP_AUTH_GEN_BOND)
171
172/* Secure Connections, MITM, no Bonding */
173#define SMP_AUTH_SC_MITM_NB     (SMP_SC_SUPPORT_BIT | SMP_AUTH_YN_BIT | SMP_AUTH_NO_BOND)
174
175/* Secure Connections, MITM, Bonding */
176#define SMP_AUTH_SC_MITM_GB     (SMP_SC_SUPPORT_BIT | SMP_AUTH_YN_BIT | SMP_AUTH_GEN_BOND)
177
178 /* All AuthReq RFU bits are set to 1 - NOTE: reserved bit in Bonding_Flags is not set */
179#define SMP_AUTH_ALL_RFU_SET    0xF8
180
181typedef UINT8 tSMP_AUTH_REQ;
182
183#define SMP_SEC_NONE                 0
184#define SMP_SEC_UNAUTHENTICATE      (1 << 0)
185#define SMP_SEC_AUTHENTICATED       (1 << 2)
186typedef UINT8 tSMP_SEC_LEVEL;
187
188/* Maximum Encryption Key Size range */
189#define SMP_ENCR_KEY_SIZE_MIN       7
190#define SMP_ENCR_KEY_SIZE_MAX       16
191
192/* SMP key types */
193#define SMP_SEC_KEY_TYPE_ENC                (1 << 0)    /* encryption key */
194#define SMP_SEC_KEY_TYPE_ID                 (1 << 1)    /* identity key */
195#define SMP_SEC_KEY_TYPE_CSRK               (1 << 2)    /* slave CSRK */
196#define SMP_SEC_KEY_TYPE_LK                 (1 << 3)    /* BR/EDR link key */
197typedef UINT8 tSMP_KEYS;
198
199#define SMP_BR_SEC_DEFAULT_KEY   (SMP_SEC_KEY_TYPE_ENC | SMP_SEC_KEY_TYPE_ID | \
200                                  SMP_SEC_KEY_TYPE_CSRK)
201
202/* default security key distribution value */
203#define SMP_SEC_DEFAULT_KEY      (SMP_SEC_KEY_TYPE_ENC | SMP_SEC_KEY_TYPE_ID | \
204                                  SMP_SEC_KEY_TYPE_CSRK | SMP_SEC_KEY_TYPE_LK)
205
206/* data type for BTM_SP_IO_REQ_EVT */
207typedef struct
208{
209    tSMP_IO_CAP     io_cap;         /* local IO capabilities */
210    tSMP_OOB_FLAG   oob_data;       /* OOB data present (locally) for the peer device */
211    tSMP_AUTH_REQ   auth_req;       /* Authentication required (for local device) */
212    UINT8           max_key_size;   /* max encryption key size */
213    tSMP_KEYS       init_keys;      /* initiator keys to be distributed */
214    tSMP_KEYS       resp_keys;      /* responder keys */
215} tSMP_IO_REQ;
216
217typedef struct
218{
219    tSMP_STATUS       reason;
220    tSMP_SEC_LEVEL    sec_level;
221    BOOLEAN     is_pair_cancel;
222} tSMP_CMPL;
223
224typedef struct
225{
226    BT_OCTET32  x;
227    BT_OCTET32  y;
228} tSMP_PUBLIC_KEY;
229
230/* the data associated with the info sent to the peer via OOB interface */
231typedef struct
232{
233    BOOLEAN         present;
234    BT_OCTET16      randomizer;
235    BT_OCTET16      commitment;
236
237    tBLE_BD_ADDR    addr_sent_to;
238    BT_OCTET32      private_key_used;   /* is used to calculate: */
239                    /* publ_key_used = P-256(private_key_used, curve_p256.G) - send it to the */
240                    /* other side */
241                    /* dhkey = P-256(private_key_used, publ key rcvd from the other side) */
242    tSMP_PUBLIC_KEY publ_key_used; /* P-256(private_key_used, curve_p256.G) */
243} tSMP_LOC_OOB_DATA;
244
245/* the data associated with the info received from the peer via OOB interface */
246typedef struct
247{
248    BOOLEAN         present;
249    BT_OCTET16      randomizer;
250    BT_OCTET16      commitment;
251    tBLE_BD_ADDR    addr_rcvd_from;
252} tSMP_PEER_OOB_DATA;
253
254typedef struct
255{
256    tSMP_LOC_OOB_DATA   loc_oob_data;
257    tSMP_PEER_OOB_DATA  peer_oob_data;
258} tSMP_SC_OOB_DATA;
259
260
261typedef union
262{
263    UINT32          passkey;
264    tSMP_IO_REQ     io_req;     /* IO request */
265    tSMP_CMPL       cmplt;
266    tSMP_OOB_DATA_TYPE  req_oob_type;
267    tSMP_LOC_OOB_DATA   loc_oob_data;
268}tSMP_EVT_DATA;
269
270
271/* AES Encryption output */
272typedef struct
273{
274    UINT8   status;
275    UINT8   param_len;
276    UINT16  opcode;
277    UINT8   param_buf[BT_OCTET16_LEN];
278} tSMP_ENC;
279
280/* Security Manager events - Called by the stack when Security Manager related events occur.*/
281typedef UINT8 (tSMP_CALLBACK) (tSMP_EVT event, BD_ADDR bd_addr, tSMP_EVT_DATA *p_data);
282
283/* callback function for CMAC algorithm
284*/
285typedef void (tCMAC_CMPL_CBACK)(UINT8 *p_mac, UINT16 tlen, UINT32 sign_counter);
286
287/*****************************************************************************
288**  External Function Declarations
289*****************************************************************************/
290#ifdef __cplusplus
291extern "C"
292{
293#endif
294/* API of SMP */
295
296/*******************************************************************************
297**
298** Function         SMP_Init
299**
300** Description      This function initializes the SMP unit.
301**
302** Returns          void
303**
304*******************************************************************************/
305extern void SMP_Init(void);
306
307/*******************************************************************************
308**
309** Function         SMP_SetTraceLevel
310**
311** Description      This function sets the trace level for SMP.  If called with
312**                  a value of 0xFF, it simply returns the current trace level.
313**
314** Returns          The new or current trace level
315**
316*******************************************************************************/
317extern UINT8 SMP_SetTraceLevel (UINT8 new_level);
318
319/*******************************************************************************
320**
321** Function         SMP_Register
322**
323** Description      This function register for the SMP service callback.
324**
325** Returns          void
326**
327*******************************************************************************/
328extern BOOLEAN SMP_Register (tSMP_CALLBACK *p_cback);
329
330/*******************************************************************************
331**
332** Function         SMP_Pair
333**
334** Description      This function is called to start a SMP pairing.
335**
336** Returns          SMP_STARTED if bond started, else otherwise exception.
337**
338*******************************************************************************/
339extern tSMP_STATUS SMP_Pair (BD_ADDR bd_addr);
340
341/*******************************************************************************
342**
343** Function         SMP_BR_PairWith
344**
345** Description      This function is called to start a SMP pairing over BR/EDR.
346**
347** Returns          SMP_STARTED if pairing started, otherwise reason for failure.
348**
349*******************************************************************************/
350extern tSMP_STATUS SMP_BR_PairWith (BD_ADDR bd_addr);
351
352/*******************************************************************************
353**
354** Function         SMP_PairCancel
355**
356** Description      This function is called to cancel a SMP pairing.
357**
358** Returns          TRUE - pairing cancelled
359**
360*******************************************************************************/
361extern  BOOLEAN SMP_PairCancel (BD_ADDR bd_addr);
362
363/*******************************************************************************
364**
365** Function         SMP_SecurityGrant
366**
367** Description      This function is called to grant security process.
368**
369** Parameters       bd_addr - peer device bd address.
370**                  res     - result of the operation SMP_SUCCESS if success.
371**                            Otherwise, SMP_REPEATED_ATTEMPTS is too many attempts.
372**
373** Returns          None
374**
375*******************************************************************************/
376extern void SMP_SecurityGrant(BD_ADDR bd_addr, UINT8 res);
377
378/*******************************************************************************
379**
380** Function         SMP_PasskeyReply
381**
382** Description      This function is called after Security Manager submitted
383**                  Passkey request to the application.
384**
385** Parameters:      bd_addr      - Address of the device for which PIN was requested
386**                  res          - result of the operation SMP_SUCCESS if success
387**                  passkey      - numeric value in the range of
388**                  BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)).
389**
390*******************************************************************************/
391extern void SMP_PasskeyReply (BD_ADDR bd_addr, UINT8 res, UINT32 passkey);
392
393/*******************************************************************************
394**
395** Function         SMP_ConfirmReply
396**
397** Description      This function is called after Security Manager submitted
398**                  numeric comparison request to the application.
399**
400** Parameters:      bd_addr      - Address of the device with which numeric
401**                                 comparison was requested
402**                  res          - comparison result SMP_SUCCESS if success
403**
404*******************************************************************************/
405extern void SMP_ConfirmReply (BD_ADDR bd_addr, UINT8 res);
406
407/*******************************************************************************
408**
409** Function         SMP_OobDataReply
410**
411** Description      This function is called to provide the OOB data for
412**                  SMP in response to SMP_OOB_REQ_EVT
413**
414** Parameters:      bd_addr     - Address of the peer device
415**                  res         - result of the operation SMP_SUCCESS if success
416**                  p_data      - SM Randomizer  C.
417**
418*******************************************************************************/
419extern void SMP_OobDataReply(BD_ADDR bd_addr, tSMP_STATUS res, UINT8 len,
420                             UINT8 *p_data);
421
422/*******************************************************************************
423**
424** Function         SMP_SecureConnectionOobDataReply
425**
426** Description      This function is called to provide the SC OOB data for
427**                  SMP in response to SMP_SC_OOB_REQ_EVT
428**
429** Parameters:      p_data      - pointer to the data
430**
431*******************************************************************************/
432extern void SMP_SecureConnectionOobDataReply(UINT8 *p_data);
433
434/*******************************************************************************
435**
436** Function         SMP_Encrypt
437**
438** Description      This function is called to encrypt the data with the specified
439**                  key
440**
441** Parameters:      key                 - Pointer to key key[0] conatins the MSB
442**                  key_len             - key length
443**                  plain_text          - Pointer to data to be encrypted
444**                                        plain_text[0] conatins the MSB
445**                  pt_len              - plain text length
446**                  p_out               - pointer to the encrypted outputs
447**
448**  Returns         Boolean - TRUE: encryption is successful
449*******************************************************************************/
450extern BOOLEAN SMP_Encrypt (UINT8 *key, UINT8 key_len,
451                            UINT8 *plain_text, UINT8 pt_len,
452                            tSMP_ENC *p_out);
453
454/*******************************************************************************
455**
456** Function         SMP_KeypressNotification
457**
458** Description      This function is called to notify SM about Keypress Notification.
459**
460** Parameters:      bd_addr      - Address of the device to send keypress
461**                                 notification to
462**                  value        - keypress notification parameter value
463**
464*******************************************************************************/
465extern void SMP_KeypressNotification (BD_ADDR bd_addr, UINT8 value);
466
467/*******************************************************************************
468**
469** Function         SMP_CreateLocalSecureConnectionsOobData
470**
471** Description      This function is called to start creation of local SC OOB
472**                  data set (tSMP_LOC_OOB_DATA).
473**
474** Parameters:      bd_addr      - Address of the device to send OOB data block
475**                                 to.
476**
477**  Returns         Boolean - TRUE: creation of local SC OOB data set started.
478*******************************************************************************/
479extern BOOLEAN SMP_CreateLocalSecureConnectionsOobData (
480                                                                  tBLE_BD_ADDR *addr_to_send_to);
481
482#ifdef __cplusplus
483}
484#endif
485#endif /* SMP_API_H */
486