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 "common/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 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 */ 67 typedef 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) /* 0x0F */ 89 90 /* 0x0F unknown IO capability, unable to decide association model */ 91 #define SMP_UNKNOWN_IO_CAP (SMP_MAX_FAIL_RSN_PER_SPEC + 0x02) /* 0x10 */ 92 93 #define SMP_INIT_FAIL (SMP_MAX_FAIL_RSN_PER_SPEC + 0x03) /* 0x11 */ 94 #define SMP_CONFIRM_FAIL (SMP_MAX_FAIL_RSN_PER_SPEC + 0x04) /* 0x12 */ 95 #define SMP_BUSY (SMP_MAX_FAIL_RSN_PER_SPEC + 0x05) /* 0x13 */ 96 #define SMP_ENC_FAIL (SMP_MAX_FAIL_RSN_PER_SPEC + 0x06) /* 0x14 */ 97 #define SMP_STARTED (SMP_MAX_FAIL_RSN_PER_SPEC + 0x07) /* 0x15 */ 98 #define SMP_RSP_TIMEOUT (SMP_MAX_FAIL_RSN_PER_SPEC + 0x08) /* 0x16 */ 99 #define SMP_DIV_NOT_AVAIL (SMP_MAX_FAIL_RSN_PER_SPEC + 0x09) /* 0x17 */ 100 101 /* 0x17 unspecified failed reason */ 102 #define SMP_FAIL (SMP_MAX_FAIL_RSN_PER_SPEC + 0x0A) /* 0x18 */ 103 104 #define SMP_CONN_TOUT (SMP_MAX_FAIL_RSN_PER_SPEC + 0x0B) /* 0x19 */ 105 #define SMP_SUCCESS 0 106 107 typedef 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 117 typedef 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 */ 124 enum { 125 SMP_OOB_NONE, 126 SMP_OOB_PRESENT, 127 SMP_OOB_UNKNOWN 128 }; 129 typedef UINT8 tSMP_OOB_FLAG; 130 131 /* type of OOB data required from application */ 132 enum { 133 SMP_OOB_INVALID_TYPE, 134 SMP_OOB_PEER, 135 SMP_OOB_LOCAL, 136 SMP_OOB_BOTH 137 }; 138 typedef UINT8 tSMP_OOB_DATA_TYPE; 139 140 #define SMP_AUTH_NO_BOND 0x00 141 #define SMP_AUTH_GEN_BOND 0x01 //todo sdh change GEN_BOND to BOND 142 143 /* SMP Authentication requirement */ 144 #define SMP_AUTH_YN_BIT (1 << 2) 145 #define SMP_SC_SUPPORT_BIT (1 << 3) 146 #define SMP_KP_SUPPORT_BIT (1 << 4) 147 148 #define SMP_AUTH_MASK (SMP_AUTH_GEN_BOND|SMP_AUTH_YN_BIT|SMP_SC_SUPPORT_BIT|SMP_KP_SUPPORT_BIT) 149 150 #define SMP_AUTH_BOND SMP_AUTH_GEN_BOND 151 152 /* no MITM, No Bonding, encryption only */ 153 #define SMP_AUTH_NB_ENC_ONLY 0x00 //(SMP_AUTH_MASK | BTM_AUTH_SP_NO) 154 155 /* MITM, No Bonding, Use IO Capability to determine authentication procedure */ 156 #define SMP_AUTH_NB_IOCAP (SMP_AUTH_NO_BOND | SMP_AUTH_YN_BIT) 157 158 /* No MITM, General Bonding, Encryption only */ 159 #define SMP_AUTH_GB_ENC_ONLY (SMP_AUTH_GEN_BOND ) 160 161 /* MITM, General Bonding, Use IO Capability to determine authentication procedure */ 162 #define SMP_AUTH_GB_IOCAP (SMP_AUTH_GEN_BOND | SMP_AUTH_YN_BIT) 163 164 /* Secure Connections, no MITM, no Bonding */ 165 #define SMP_AUTH_SC_ENC_ONLY (SMP_SC_SUPPORT_BIT) 166 167 /* Secure Connections, no MITM, Bonding */ 168 #define SMP_AUTH_SC_GB (SMP_SC_SUPPORT_BIT | SMP_AUTH_GEN_BOND) 169 170 /* Secure Connections, MITM, no Bonding */ 171 #define SMP_AUTH_SC_MITM_NB (SMP_SC_SUPPORT_BIT | SMP_AUTH_YN_BIT | SMP_AUTH_NO_BOND) 172 173 /* Secure Connections, MITM, Bonding */ 174 #define SMP_AUTH_SC_MITM_GB (SMP_SC_SUPPORT_BIT | SMP_AUTH_YN_BIT | SMP_AUTH_GEN_BOND) 175 176 /* All AuthReq RFU bits are set to 1 - NOTE: reserved bit in Bonding_Flags is not set */ 177 #define SMP_AUTH_ALL_RFU_SET 0xF8 178 179 typedef UINT8 tSMP_AUTH_REQ; 180 181 #define SMP_SEC_NONE 0 182 #define SMP_SEC_UNAUTHENTICATE (1 << 0) 183 #define SMP_SEC_AUTHENTICATED (1 << 2) 184 typedef UINT8 tSMP_SEC_LEVEL; 185 186 /* Maximum Encryption Key Size range */ 187 #define SMP_ENCR_KEY_SIZE_MIN 7 188 #define SMP_ENCR_KEY_SIZE_MAX 16 189 190 /* SMP key types */ 191 #define SMP_SEC_KEY_TYPE_ENC (1 << 0) /* encryption key */ 192 #define SMP_SEC_KEY_TYPE_ID (1 << 1) /* identity key */ 193 #define SMP_SEC_KEY_TYPE_CSRK (1 << 2) /* slave CSRK */ 194 #define SMP_SEC_KEY_TYPE_LK (1 << 3) /* BR/EDR link key */ 195 typedef UINT8 tSMP_KEYS; 196 197 #define SMP_BR_SEC_DEFAULT_KEY (SMP_SEC_KEY_TYPE_ENC | SMP_SEC_KEY_TYPE_ID | \ 198 SMP_SEC_KEY_TYPE_CSRK) 199 200 /* default security key distribution value */ 201 #define SMP_SEC_DEFAULT_KEY (SMP_SEC_KEY_TYPE_ENC | SMP_SEC_KEY_TYPE_ID | \ 202 SMP_SEC_KEY_TYPE_CSRK | SMP_SEC_KEY_TYPE_LK) 203 204 #define SMP_SC_KEY_STARTED 0 /* passkey entry started */ 205 #define SMP_SC_KEY_ENTERED 1 /* passkey digit entered */ 206 #define SMP_SC_KEY_ERASED 2 /* passkey digit erased */ 207 #define SMP_SC_KEY_CLEARED 3 /* passkey cleared */ 208 #define SMP_SC_KEY_COMPLT 4 /* passkey entry completed */ 209 #define SMP_SC_KEY_OUT_OF_RANGE 5 /* out of range */ 210 typedef UINT8 tSMP_SC_KEY_TYPE; 211 212 /* data type for BTM_SP_IO_REQ_EVT */ 213 typedef struct { 214 tSMP_IO_CAP io_cap; /* local IO capabilities */ 215 tSMP_OOB_FLAG oob_data; /* OOB data present (locally) for the peer device */ 216 tSMP_AUTH_REQ auth_req; /* Authentication required (for local device) */ 217 UINT8 max_key_size; /* max encryption key size */ 218 tSMP_KEYS init_keys; /* initiator keys to be distributed */ 219 tSMP_KEYS resp_keys; /* responder keys */ 220 } tSMP_IO_REQ; 221 222 typedef struct { 223 tSMP_STATUS reason; 224 tSMP_SEC_LEVEL sec_level; 225 BOOLEAN is_pair_cancel; 226 BOOLEAN smp_over_br; 227 tSMP_AUTH_REQ auth_mode; 228 } tSMP_CMPL; 229 230 typedef struct { 231 BT_OCTET32 x; 232 BT_OCTET32 y; 233 } tSMP_PUBLIC_KEY; 234 235 /* the data associated with the info sent to the peer via OOB interface */ 236 typedef struct { 237 BOOLEAN present; 238 BT_OCTET16 randomizer; 239 BT_OCTET16 commitment; 240 241 tBLE_BD_ADDR addr_sent_to; 242 BT_OCTET32 private_key_used; /* is used to calculate: */ 243 /* publ_key_used = P-256(private_key_used, curve_p256.G) - send it to the */ 244 /* other side */ 245 /* dhkey = P-256(private_key_used, publ key rcvd from the other side) */ 246 tSMP_PUBLIC_KEY publ_key_used; /* P-256(private_key_used, curve_p256.G) */ 247 } tSMP_LOC_OOB_DATA; 248 249 /* the data associated with the info received from the peer via OOB interface */ 250 typedef struct { 251 BOOLEAN present; 252 BT_OCTET16 randomizer; 253 BT_OCTET16 commitment; 254 tBLE_BD_ADDR addr_rcvd_from; 255 } tSMP_PEER_OOB_DATA; 256 257 typedef struct { 258 tSMP_LOC_OOB_DATA loc_oob_data; 259 tSMP_PEER_OOB_DATA peer_oob_data; 260 } tSMP_SC_OOB_DATA; 261 262 263 typedef union { 264 UINT32 passkey; 265 tSMP_IO_REQ io_req; /* IO request */ 266 tSMP_CMPL cmplt; 267 tSMP_OOB_DATA_TYPE req_oob_type; 268 tSMP_LOC_OOB_DATA loc_oob_data; 269 } tSMP_EVT_DATA; 270 271 272 /* AES Encryption output */ 273 typedef struct { 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.*/ 281 typedef UINT8 (tSMP_CALLBACK) (tSMP_EVT event, BD_ADDR bd_addr, tSMP_EVT_DATA *p_data); 282 283 /* callback function for CMAC algorithm 284 */ 285 typedef void (tCMAC_CMPL_CBACK)(UINT8 *p_mac, UINT16 tlen, UINT32 sign_counter); 286 287 /***************************************************************************** 288 ** External Function Declarations 289 *****************************************************************************/ 290 #ifdef __cplusplus 291 extern "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 *******************************************************************************/ 305 extern void SMP_Init(void); 306 307 /******************************************************************************* 308 ** 309 ** Function SMP_Free 310 ** 311 ** Description This function de initializes the SMP unit. 312 ** 313 ** Returns void 314 ** 315 *******************************************************************************/ 316 extern void SMP_Free(void); 317 318 319 /******************************************************************************* 320 ** 321 ** Function SMP_SetTraceLevel 322 ** 323 ** Description This function sets the trace level for SMP. If called with 324 ** a value of 0xFF, it simply returns the current trace level. 325 ** 326 ** Returns The new or current trace level 327 ** 328 *******************************************************************************/ 329 extern UINT8 SMP_SetTraceLevel (UINT8 new_level); 330 331 /******************************************************************************* 332 ** 333 ** Function SMP_Register 334 ** 335 ** Description This function register for the SMP service callback. 336 ** 337 ** Returns void 338 ** 339 *******************************************************************************/ 340 extern BOOLEAN SMP_Register (tSMP_CALLBACK *p_cback); 341 342 /******************************************************************************* 343 ** 344 ** Function SMP_Pair 345 ** 346 ** Description This function is called to start a SMP pairing. 347 ** 348 ** Returns SMP_STARTED if bond started, else otherwise exception. 349 ** 350 *******************************************************************************/ 351 extern tSMP_STATUS SMP_Pair (BD_ADDR bd_addr); 352 353 /******************************************************************************* 354 ** 355 ** Function SMP_BR_PairWith 356 ** 357 ** Description This function is called to start a SMP pairing over BR/EDR. 358 ** 359 ** Returns SMP_STARTED if pairing started, otherwise reason for failure. 360 ** 361 *******************************************************************************/ 362 extern tSMP_STATUS SMP_BR_PairWith (BD_ADDR bd_addr); 363 364 /******************************************************************************* 365 ** 366 ** Function SMP_PairCancel 367 ** 368 ** Description This function is called to cancel a SMP pairing. 369 ** 370 ** Returns TRUE - pairing cancelled 371 ** 372 *******************************************************************************/ 373 extern BOOLEAN SMP_PairCancel (BD_ADDR bd_addr); 374 375 /******************************************************************************* 376 ** 377 ** Function SMP_SecurityGrant 378 ** 379 ** Description This function is called to grant security process. 380 ** 381 ** Parameters bd_addr - peer device bd address. 382 ** res - result of the operation SMP_SUCCESS if success. 383 ** Otherwise, SMP_REPEATED_ATTEMPTS is too many attempts. 384 ** 385 ** Returns None 386 ** 387 *******************************************************************************/ 388 extern void SMP_SecurityGrant(BD_ADDR bd_addr, UINT8 res); 389 390 /******************************************************************************* 391 ** 392 ** Function SMP_PasskeyReply 393 ** 394 ** Description This function is called after Security Manager submitted 395 ** Passkey request to the application. 396 ** 397 ** Parameters: bd_addr - Address of the device for which PIN was requested 398 ** res - result of the operation SMP_SUCCESS if success 399 ** passkey - numeric value in the range of 400 ** BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)). 401 ** 402 *******************************************************************************/ 403 extern void SMP_PasskeyReply (BD_ADDR bd_addr, UINT8 res, UINT32 passkey); 404 405 /******************************************************************************* 406 ** 407 ** Function SMP_SetStaticPasskey 408 ** 409 ** Description This function is called to set static passkey 410 ** 411 ** 412 ** Parameters: add - set static passkey when add is TRUE 413 ** clear static passkey when add is FALSE 414 ** passkey - static passkey 415 ** 416 ** 417 *******************************************************************************/ 418 extern void SMP_SetStaticPasskey (BOOLEAN add, UINT32 passkey); 419 420 /******************************************************************************* 421 ** 422 ** Function SMP_ConfirmReply 423 ** 424 ** Description This function is called after Security Manager submitted 425 ** numeric comparison request to the application. 426 ** 427 ** Parameters: bd_addr - Address of the device with which numeric 428 ** comparison was requested 429 ** res - comparison result SMP_SUCCESS if success 430 ** 431 *******************************************************************************/ 432 extern void SMP_ConfirmReply (BD_ADDR bd_addr, UINT8 res); 433 434 /******************************************************************************* 435 ** 436 ** Function SMP_OobDataReply 437 ** 438 ** Description This function is called to provide the OOB data for 439 ** SMP in response to SMP_OOB_REQ_EVT 440 ** 441 ** Parameters: bd_addr - Address of the peer device 442 ** res - result of the operation SMP_SUCCESS if success 443 ** p_data - SM Randomizer C. 444 ** 445 *******************************************************************************/ 446 extern void SMP_OobDataReply(BD_ADDR bd_addr, tSMP_STATUS res, UINT8 len, 447 UINT8 *p_data); 448 449 /******************************************************************************* 450 ** 451 ** Function SMP_SecureConnectionOobDataReply 452 ** 453 ** Description This function is called to provide the SC OOB data for 454 ** SMP in response to SMP_SC_OOB_REQ_EVT 455 ** 456 ** Parameters: p_data - pointer to the data 457 ** 458 *******************************************************************************/ 459 extern void SMP_SecureConnectionOobDataReply(UINT8 *p_data); 460 461 /******************************************************************************* 462 ** 463 ** Function SMP_Encrypt 464 ** 465 ** Description This function is called to encrypt the data with the specified 466 ** key 467 ** 468 ** Parameters: key - Pointer to key key[0] conatins the MSB 469 ** key_len - key length 470 ** plain_text - Pointer to data to be encrypted 471 ** plain_text[0] conatins the MSB 472 ** pt_len - plain text length 473 ** p_out - pointer to the encrypted outputs 474 ** 475 ** Returns Boolean - TRUE: encryption is successful 476 *******************************************************************************/ 477 extern BOOLEAN SMP_Encrypt (UINT8 *key, UINT8 key_len, 478 UINT8 *plain_text, UINT8 pt_len, 479 tSMP_ENC *p_out); 480 481 /******************************************************************************* 482 ** 483 ** Function SMP_KeypressNotification 484 ** 485 ** Description This function is called to notify SM about Keypress Notification. 486 ** 487 ** Parameters: bd_addr - Address of the device to send keypress 488 ** notification to 489 ** value - keypress notification parameter value 490 ** 491 *******************************************************************************/ 492 extern void SMP_KeypressNotification (BD_ADDR bd_addr, UINT8 value); 493 494 /******************************************************************************* 495 ** 496 ** Function SMP_CreateLocalSecureConnectionsOobData 497 ** 498 ** Description This function is called to start creation of local SC OOB 499 ** data set (tSMP_LOC_OOB_DATA). 500 ** 501 ** Parameters: bd_addr - Address of the device to send OOB data block 502 ** to. 503 ** 504 ** Returns Boolean - TRUE: creation of local SC OOB data set started. 505 *******************************************************************************/ 506 extern BOOLEAN SMP_CreateLocalSecureConnectionsOobData ( 507 tBLE_BD_ADDR *addr_to_send_to); 508 509 #ifdef __cplusplus 510 } 511 #endif 512 #endif /* SMP_API_H */ 513