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 */ 39 typedef 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_SUCCESS 0 65 66 typedef UINT8 tSMP_STATUS; 67 68 69 /* Device IO capability */ 70 #define SMP_IO_CAP_OUT BTM_IO_CAP_OUT /* DisplayOnly */ 71 #define SMP_IO_CAP_IO BTM_IO_CAP_IO /* DisplayYesNo */ 72 #define SMP_IO_CAP_IN BTM_IO_CAP_IN /* KeyboardOnly */ 73 #define SMP_IO_CAP_NONE BTM_IO_CAP_NONE /* NoInputNoOutput */ 74 #define SMP_IO_CAP_KBDISP BTM_IO_CAP_KBDISP /* Keyboard Display */ 75 #define SMP_IO_CAP_MAX BTM_IO_CAP_MAX 76 typedef UINT8 tSMP_IO_CAP; 77 78 #ifndef SMP_DEFAULT_IO_CAPS 79 #define SMP_DEFAULT_IO_CAPS SMP_IO_CAP_KBDISP 80 #endif 81 82 /* OOB data present or not */ 83 enum 84 { 85 SMP_OOB_NONE, 86 SMP_OOB_PRESENT, 87 SMP_OOB_UNKNOWN 88 }; 89 typedef UINT8 tSMP_OOB_FLAG; 90 91 #define SMP_AUTH_NO_BOND 0x00 92 #define SMP_AUTH_GEN_BOND 0x01 //todo sdh change GEN_BOND to BOND 93 94 /* SMP Authentication requirement */ 95 #define SMP_AUTH_YN_BIT (1 << 2) 96 #define SMP_AUTH_MASK (SMP_AUTH_GEN_BOND|SMP_AUTH_YN_BIT) 97 98 99 #define SMP_AUTH_BOND SMP_AUTH_GEN_BOND 100 101 #define SMP_AUTH_NB_ENC_ONLY 0x00 //(SMP_AUTH_MASK | BTM_AUTH_SP_NO) /* no MITM, No Bonding, Encryptino only */ 102 #define SMP_AUTH_NB_IOCAP (SMP_AUTH_NO_BOND | SMP_AUTH_YN_BIT) /* MITM, No Bonding, Use IO Capability 103 to detrermine authenticaion procedure */ 104 #define SMP_AUTH_GB_ENC_ONLY (SMP_AUTH_GEN_BOND ) /* no MITM, General Bonding, Encryptino only */ 105 #define SMP_AUTH_GB_IOCAP (SMP_AUTH_GEN_BOND | SMP_AUTH_YN_BIT) /* MITM, General Bonding, Use IO Capability 106 to detrermine authenticaion procedure */ 107 typedef UINT8 tSMP_AUTH_REQ; 108 109 #define SMP_SEC_NONE 0 110 #define SMP_SEC_UNAUTHENTICATE (1 << 0) 111 #define SMP_SEC_AUTHENTICATED (1 << 2) 112 typedef UINT8 tSMP_SEC_LEVEL; 113 114 /* SMP key types */ 115 #define SMP_SEC_KEY_TYPE_ENC (1 << 0) /* encryption key */ 116 #define SMP_SEC_KEY_TYPE_ID (1 << 1) /* identity key */ 117 #define SMP_SEC_KEY_TYPE_CSRK (1 << 2) /* slave CSRK */ 118 typedef UINT8 tSMP_KEYS; 119 120 /* default security key distribution value */ 121 #define SMP_SEC_DEFAULT_KEY (SMP_SEC_KEY_TYPE_ENC | SMP_SEC_KEY_TYPE_ID | SMP_SEC_KEY_TYPE_CSRK) 122 123 /* data type for BTM_SP_IO_REQ_EVT */ 124 typedef struct 125 { 126 tSMP_IO_CAP io_cap; /* local IO capabilities */ 127 tSMP_OOB_FLAG oob_data; /* OOB data present (locally) for the peer device */ 128 tSMP_AUTH_REQ auth_req; /* Authentication required (for local device) */ 129 UINT8 max_key_size; /* max encryption key size */ 130 tSMP_KEYS init_keys; /* initiator keys to be distributed */ 131 tSMP_KEYS resp_keys; /* responder keys */ 132 } tSMP_IO_REQ; 133 134 typedef struct 135 { 136 UINT8 reason; 137 UINT8 sec_level; 138 BOOLEAN is_pair_cancel; 139 } tSMP_CMPL; 140 141 typedef union 142 { 143 UINT32 passkey; 144 tSMP_IO_REQ io_req; /* IO request */ 145 tSMP_CMPL cmplt; 146 147 }tSMP_EVT_DATA; 148 149 150 /* AES Encryption output */ 151 typedef struct 152 { 153 UINT8 status; 154 UINT8 param_len; 155 UINT16 opcode; 156 UINT8 param_buf[BT_OCTET16_LEN]; 157 } tSMP_ENC; 158 159 /* Simple Pairing Events. Called by the stack when Simple Pairing related 160 ** events occur. 161 */ 162 typedef UINT8 (tSMP_CALLBACK) (tSMP_EVT event, BD_ADDR bd_addr, tSMP_EVT_DATA *p_data); 163 164 /* callback function for CMAC algorithm 165 */ 166 typedef void (tCMAC_CMPL_CBACK)(UINT8 *p_mac, UINT16 tlen, UINT32 sign_counter); 167 168 /***************************************************************************** 169 ** External Function Declarations 170 *****************************************************************************/ 171 #ifdef __cplusplus 172 extern "C" 173 { 174 #endif 175 /* API of SMP */ 176 177 /******************************************************************************* 178 ** 179 ** Function SMP_Init 180 ** 181 ** Description This function initializes the SMP unit. 182 ** 183 ** Returns void 184 ** 185 *******************************************************************************/ 186 SMP_API extern void SMP_Init(void); 187 188 /******************************************************************************* 189 ** 190 ** Function SMP_SetTraceLevel 191 ** 192 ** Description This function sets the trace level for SMP. If called with 193 ** a value of 0xFF, it simply returns the current trace level. 194 ** 195 ** Returns The new or current trace level 196 ** 197 *******************************************************************************/ 198 SMP_API extern UINT8 SMP_SetTraceLevel (UINT8 new_level); 199 200 /******************************************************************************* 201 ** 202 ** Function SMP_Register 203 ** 204 ** Description This function register for the SMP service callback. 205 ** 206 ** Returns void 207 ** 208 *******************************************************************************/ 209 SMP_API extern BOOLEAN SMP_Register (tSMP_CALLBACK *p_cback); 210 211 /******************************************************************************* 212 ** 213 ** Function SMP_Pair 214 ** 215 ** Description This function is called to start a SMP pairing. 216 ** 217 ** Returns SMP_STARTED if bond started, else otherwise exception. 218 ** 219 *******************************************************************************/ 220 SMP_API extern tSMP_STATUS SMP_Pair (BD_ADDR bd_addr); 221 /******************************************************************************* 222 ** 223 ** Function SMP_PairCancel 224 ** 225 ** Description This function is called to cancel a SMP pairing. 226 ** 227 ** Returns TRUE - pairing cancelled 228 ** 229 *******************************************************************************/ 230 SMP_API extern BOOLEAN SMP_PairCancel (BD_ADDR bd_addr); 231 232 /******************************************************************************* 233 ** 234 ** Function SMP_SecurityGrant 235 ** 236 ** Description This function is called to grant security process. 237 ** 238 ** Parameters bd_addr - peer device bd address. 239 ** res - result of the operation SMP_SUCCESS if success. 240 ** Otherwise, SMP_REPEATED_ATTEMPTS is too many attempts. 241 ** 242 ** Returns None 243 ** 244 *******************************************************************************/ 245 SMP_API extern void SMP_SecurityGrant(BD_ADDR bd_addr, UINT8 res); 246 247 /******************************************************************************* 248 ** 249 ** Function SMP_PasskeyReply 250 ** 251 ** Description This function is called after Security Manager submitted 252 ** Passkey request to the application. 253 ** 254 ** Parameters: bd_addr - Address of the device for which PIN was requested 255 ** res - result of the operation BTM_SUCCESS if success 256 ** passkey - numeric value in the range of 257 ** BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)). 258 ** 259 *******************************************************************************/ 260 SMP_API extern void SMP_PasskeyReply (BD_ADDR bd_addr, UINT8 res, UINT32 passkey); 261 262 /******************************************************************************* 263 ** 264 ** Function SMP_OobDataReply 265 ** 266 ** Description This function is called to provide the OOB data for 267 ** Simple Pairing in response to BTM_SP_RMT_OOB_EVT 268 ** 269 ** Parameters: bd_addr - Address of the peer device 270 ** res - result of the operation SMP_SUCCESS if success 271 ** p_data - simple pairing Randomizer C. 272 ** 273 *******************************************************************************/ 274 SMP_API extern void SMP_OobDataReply(BD_ADDR bd_addr, tSMP_STATUS res, UINT8 len, 275 UINT8 *p_data); 276 277 /******************************************************************************* 278 ** 279 ** Function SMP_Encrypt 280 ** 281 ** Description This function is called to encrypt the data with the specified 282 ** key 283 ** 284 ** Parameters: key - Pointer to key key[0] conatins the MSB 285 ** key_len - key length 286 ** plain_text - Pointer to data to be encrypted 287 ** plain_text[0] conatins the MSB 288 ** pt_len - plain text length 289 ** p_out - pointer to the encrypted outputs 290 ** 291 ** Returns Boolean - TRUE: encryption is successful 292 *******************************************************************************/ 293 SMP_API extern BOOLEAN SMP_Encrypt (UINT8 *key, UINT8 key_len, 294 UINT8 *plain_text, UINT8 pt_len, 295 tSMP_ENC *p_out); 296 297 #ifdef __cplusplus 298 } 299 #endif 300 #endif /* SMP_API_H */ 301