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 internally used SMP definitions 22 * 23 ******************************************************************************/ 24 25#ifndef SMP_INT_H 26#define SMP_INT_H 27 28#include "btu.h" 29#include "smp_api.h" 30 31#define SMP_MODEL_ENC_ONLY 0 32#define SMP_MODEL_PASSKEY 1 33#define SMP_MODEL_OOB 2 34#define SMP_MODEL_KEY_NOTIF 3 35#define SMP_MODEL_MAX 4 36typedef UINT8 tSMP_ASSO_MODEL; 37 38 39#ifndef SMP_MAX_CONN 40 #define SMP_MAX_CONN 2 41#endif 42 43#define SMP_WAIT_FOR_RSP_TOUT 30 44#define SMP_WAIT_FOR_REL_DELAY_TOUT 5 45/* SMP L2CAP command code */ 46#define SMP_OPCODE_PAIRING_REQ 0x01 47#define SMP_OPCODE_PAIRING_RSP 0x02 48#define SMP_OPCODE_CONFIRM 0x03 49#define SMP_OPCODE_INIT 0x04 50#define SMP_OPCODE_PAIRING_FAILED 0x05 51#define SMP_OPCODE_ENCRYPT_INFO 0x06 52#define SMP_OPCODE_MASTER_ID 0x07 53#define SMP_OPCODE_IDENTITY_INFO 0x08 54#define SMP_OPCODE_ID_ADDR 0x09 55#define SMP_OPCODE_SIGN_INFO 0x0A 56#define SMP_OPCODE_SEC_REQ 0x0B 57#define SMP_OPCODE_MAX (SMP_OPCODE_SEC_REQ + 1) 58 59/* SMP events */ 60#define SMP_PAIRING_REQ_EVT SMP_OPCODE_PAIRING_REQ 61#define SMP_PAIRING_RSP_EVT SMP_OPCODE_PAIRING_RSP 62#define SMP_CONFIRM_EVT SMP_OPCODE_CONFIRM 63#define SMP_RAND_EVT SMP_OPCODE_INIT 64#define SMP_PAIRING_FAILED_EVT SMP_OPCODE_PAIRING_FAILED 65#define SMP_ENCRPTION_INFO_EVT SMP_OPCODE_ENCRYPT_INFO 66#define SMP_MASTER_ID_EVT SMP_OPCODE_MASTER_ID 67#define SMP_ID_INFO_EVT SMP_OPCODE_IDENTITY_INFO 68#define SMP_ID_ADDR_EVT SMP_OPCODE_ID_ADDR 69#define SMP_SIGN_INFO_EVT SMP_OPCODE_SIGN_INFO 70#define SMP_SECURITY_REQ_EVT SMP_OPCODE_SEC_REQ 71 72#define SMP_SELF_DEF_EVT SMP_SECURITY_REQ_EVT 73#define SMP_KEY_READY_EVT (SMP_SELF_DEF_EVT + 1) 74#define SMP_ENCRYPTED_EVT (SMP_SELF_DEF_EVT + 2) 75#define SMP_L2CAP_CONN_EVT (SMP_SELF_DEF_EVT + 3) 76#define SMP_L2CAP_DISCONN_EVT (SMP_SELF_DEF_EVT + 4) 77#define SMP_IO_RSP_EVT (SMP_SELF_DEF_EVT + 5) 78#define SMP_API_SEC_GRANT_EVT (SMP_SELF_DEF_EVT + 6) 79#define SMP_TK_REQ_EVT (SMP_SELF_DEF_EVT + 7) 80#define SMP_AUTH_CMPL_EVT (SMP_SELF_DEF_EVT + 8) 81#define SMP_ENC_REQ_EVT (SMP_SELF_DEF_EVT + 9) 82#define SMP_BOND_REQ_EVT (SMP_SELF_DEF_EVT + 10) 83#define SMP_DISCARD_SEC_REQ_EVT (SMP_SELF_DEF_EVT + 11) 84#define SMP_RELEASE_DELAY_EVT (SMP_SELF_DEF_EVT + 12) 85#define SMP_RELEASE_DELAY_TOUT_EVT (SMP_SELF_DEF_EVT + 13) 86typedef UINT8 tSMP_EVENT; 87#define SMP_MAX_EVT SMP_RELEASE_DELAY_TOUT_EVT + 1 88 89/* auumption it's only using the low 8 bits, if bigger than that, need to expand it to be 16 bits */ 90#define SMP_SEC_KEY_MASK 0x00ff 91 92/* SMP pairing state */ 93enum 94{ 95 SMP_ST_IDLE, 96 SMP_ST_WAIT_APP_RSP, 97 SMP_ST_SEC_REQ_PENDING, 98 SMP_ST_PAIR_REQ_RSP, 99 SMP_ST_WAIT_CONFIRM, 100 SMP_ST_CONFIRM, 101 SMP_ST_RAND, 102 SMP_ST_ENC_PENDING, 103 SMP_ST_BOND_PENDING, 104 SMP_ST_RELEASE_DELAY, 105 SMP_ST_MAX 106}; 107typedef UINT8 tSMP_STATE; 108 109/* random and encrption activity state */ 110enum 111{ 112 SMP_GEN_COMPARE = 1, 113 SMP_GEN_CONFIRM, 114 115 SMP_GEN_DIV_LTK, 116 SMP_GEN_DIV_CSRK, 117 SMP_GEN_RAND_V, 118 SMP_GEN_TK, 119 SMP_GEN_SRAND_MRAND, 120 SMP_GEN_SRAND_MRAND_CONT 121}; 122 123enum 124{ 125 SMP_KEY_TYPE_TK, 126 SMP_KEY_TYPE_CFM, 127 SMP_KEY_TYPE_CMP, 128 SMP_KEY_TYPE_STK, 129 SMP_KEY_TYPE_LTK 130}; 131typedef struct 132{ 133 UINT8 key_type; 134 UINT8* p_data; 135}tSMP_KEY; 136 137typedef union 138{ 139 UINT8 *p_data; /* UINT8 type data pointer */ 140 tSMP_KEY key; 141 UINT16 reason; 142}tSMP_INT_DATA; 143 144/* internal status mask */ 145#define SMP_PAIR_FLAGS_WE_STARTED_DD (1) 146#define SMP_PAIR_FLAGS_PEER_STARTED_DD (1 << 1) 147#define SMP_PAIR_FLAGS_CMD_CONFIRM (1 << SMP_OPCODE_CONFIRM) /* 1 << 3 */ 148#define SMP_PAIR_FLAG_ENC_AFTER_PAIR (1 << 4) 149 150/* check if authentication requirement need MITM protection */ 151#define SMP_NO_MITM_REQUIRED(x) (((x) & SMP_AUTH_YN_BIT) == 0) 152 153#define SMP_ENCRYT_KEY_SIZE 16 154#define SMP_ENCRYT_DATA_SIZE 16 155#define SMP_ECNCRPYT_STATUS HCI_SUCCESS 156 157/* SMP control block */ 158typedef struct 159{ 160 tSMP_CALLBACK *p_callback; 161 TIMER_LIST_ENT rsp_timer_ent; 162 UINT8 trace_level; 163 164 BD_ADDR pairing_bda; 165 166 tSMP_STATE state; 167 UINT8 failure; 168 UINT8 status; 169 UINT8 role; 170 UINT8 flags; 171 UINT8 cb_evt; 172 173 tSMP_SEC_LEVEL sec_level; 174 BOOLEAN connect_initialized; 175 BT_OCTET16 confirm; 176 BT_OCTET16 rconfirm; 177 BT_OCTET16 rrand; 178 BT_OCTET16 rand; 179 tSMP_IO_CAP peer_io_caps; 180 tSMP_IO_CAP loc_io_caps; 181 tSMP_OOB_FLAG peer_oob_flag; 182 tSMP_OOB_FLAG loc_oob_flag; 183 tSMP_AUTH_REQ peer_auth_req; 184 tSMP_AUTH_REQ loc_auth_req; 185 UINT8 peer_enc_size; 186 UINT8 loc_enc_size; 187 UINT8 peer_i_key; 188 UINT8 peer_r_key; 189 UINT8 loc_i_key; 190 UINT8 loc_r_key; 191 192 BT_OCTET16 tk; 193 BT_OCTET16 ltk; 194 UINT16 div; 195 BT_OCTET16 csrk; /* storage for local CSRK */ 196 UINT16 ediv; 197 BT_OCTET8 enc_rand; 198 199 UINT8 rand_enc_proc; 200 BOOLEAN last_cmd; 201 UINT8 addr_type; 202 BD_ADDR local_bda; 203 BOOLEAN is_pair_cancel; 204 BOOLEAN discard_sec_req; 205 UINT8 rcvd_cmd_code; 206 UINT8 rcvd_cmd_len; 207#if SMP_CONFORMANCE_TESTING == TRUE 208 BOOLEAN enable_test_confirm_val; 209 BT_OCTET16 test_confirm; 210 BOOLEAN enable_test_rand_val; 211 BT_OCTET16 test_rand; 212 BOOLEAN enable_test_pair_fail; 213 UINT8 pair_fail_status; 214 BOOLEAN remove_fixed_channel_disable; 215 BOOLEAN skip_test_compare_check; 216#endif 217 218}tSMP_CB; 219 220/* Server Action functions are of this type */ 221typedef void (*tSMP_ACT)(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 222 223 224#ifdef __cplusplus 225extern "C" 226{ 227#endif 228 229#if SMP_DYNAMIC_MEMORY == FALSE 230 SMP_API extern tSMP_CB smp_cb; 231#else 232 SMP_API extern tSMP_CB *smp_cb_ptr; 233#define smp_cb (*smp_cb_ptr) 234#endif 235 236#ifdef __cplusplus 237} 238#endif 239 240/* Functions provided by att_main.c */ 241SMP_API extern void smp_init (void); 242 243#if SMP_CONFORMANCE_TESTING == TRUE 244/* Used only for conformance testing */ 245SMP_API extern void smp_set_test_confirm_value (BOOLEAN enable, UINT8 *p_c_value); 246SMP_API extern void smp_set_test_rand_value (BOOLEAN enable, UINT8 *p_c_value); 247SMP_API extern void smp_set_test_pair_fail_status (BOOLEAN enable, UINT8 status); 248SMP_API extern void smp_remove_fixed_channel_disable (BOOLEAN disable); 249SMP_API extern void smp_skip_compare_check (BOOLEAN enable); 250#endif 251/* smp main */ 252extern void smp_sm_event(tSMP_CB *p_cb, tSMP_EVENT event, void *p_data); 253 254extern void smp_proc_sec_request(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 255extern void smp_send_pair_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 256extern void smp_send_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 257extern void smp_send_pair_fail(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 258extern void smp_send_init(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 259extern void smp_proc_sec_request(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 260extern void smp_proc_pair_fail(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 261extern void smp_proc_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 262extern void smp_proc_init(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 263extern void smp_proc_enc_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 264extern void smp_proc_master_id(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 265extern void smp_proc_id_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 266extern void smp_proc_id_addr(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 267extern void smp_proc_sec_grant(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 268extern void smp_proc_sec_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 269extern void smp_proc_sl_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 270extern void smp_start_enc(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 271extern void smp_enc_cmpl(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 272extern void smp_proc_discard(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 273extern void smp_proc_release_delay(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 274extern void smp_proc_release_delay_tout(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 275extern void smp_pairing_cmpl(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 276extern void smp_decide_asso_model(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 277extern void smp_send_app_cback(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 278extern void smp_proc_compare(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 279extern void smp_check_auth_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 280extern void smp_proc_io_rsp(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 281extern void smp_send_id_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 282extern void smp_send_enc_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 283extern void smp_send_csrk_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 284extern void smp_send_ltk_reply(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 285extern void smp_proc_pair_cmd(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 286extern void smp_pair_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 287extern void smp_idle_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 288extern void smp_send_pair_rsp(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 289extern void smp_key_distribution(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 290extern void smp_proc_srk_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 291extern void smp_generate_csrk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 292extern void smp_delay_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 293extern void smp_fast_conn_param(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 294 295/* smp_l2c */ 296extern void smp_l2cap_if_init (void); 297 298/* smp utility */ 299extern BOOLEAN smp_send_cmd(UINT8 cmd_code, tSMP_CB *p_cb); 300extern void smp_cb_cleanup(tSMP_CB *p_cb); 301extern void smp_reset_control_value(tSMP_CB *p_cb); 302extern void smp_proc_pairing_cmpl(tSMP_CB *p_cb); 303extern void smp_convert_string_to_tk(BT_OCTET16 tk, UINT32 passkey); 304extern void smp_mask_enc_key(UINT8 loc_enc_size, UINT8 * p_data); 305extern void smp_rsp_timeout(TIMER_LIST_ENT *p_tle); 306extern void smp_xor_128(BT_OCTET16 a, BT_OCTET16 b); 307extern BOOLEAN smp_encrypt_data (UINT8 *key, UINT8 key_len, 308 UINT8 *plain_text, UINT8 pt_len, 309 tSMP_ENC *p_out); 310/* smp key */ 311extern void smp_generate_confirm (tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 312extern void smp_generate_compare (tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 313extern void smp_generate_stk (tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 314extern void smp_generate_ltk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 315extern void smp_generate_passkey (tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 316extern void smp_genenrate_rand_cont(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 317 318/* smp main util */ 319extern void smp_set_state(tSMP_STATE state); 320extern tSMP_STATE smp_get_state(void); 321extern void smp_reject_unexp_pair_req(BD_ADDR bd_addr); 322 323#endif /* SMP_INT_H */ 324 325