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 tSMP_STATUS reason; 138 tSMP_SEC_LEVEL 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