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 BD_ADDR local_bda; 202 BOOLEAN is_pair_cancel; 203 BOOLEAN discard_sec_req; 204#if SMP_CONFORMANCE_TESTING == TRUE 205 BOOLEAN enable_test_confirm_val; 206 BT_OCTET16 test_confirm; 207 BOOLEAN enable_test_rand_val; 208 BT_OCTET16 test_rand; 209 BOOLEAN enable_test_pair_fail; 210 UINT8 pair_fail_status; 211 BOOLEAN remove_fixed_channel_disable; 212#endif 213 214}tSMP_CB; 215 216/* Server Action functions are of this type */ 217typedef void (*tSMP_ACT)(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 218 219 220#ifdef __cplusplus 221extern "C" 222{ 223#endif 224 225#if SMP_DYNAMIC_MEMORY == FALSE 226 SMP_API extern tSMP_CB smp_cb; 227#else 228 SMP_API extern tSMP_CB *smp_cb_ptr; 229#define smp_cb (*smp_cb_ptr) 230#endif 231 232#ifdef __cplusplus 233} 234#endif 235 236/* Functions provided by att_main.c */ 237SMP_API extern void smp_init (void); 238 239#if SMP_CONFORMANCE_TESTING == TRUE 240/* Used only for conformance testing */ 241SMP_API extern void smp_set_test_confirm_value (BOOLEAN enable, UINT8 *p_c_value); 242SMP_API extern void smp_set_test_rand_value (BOOLEAN enable, UINT8 *p_c_value); 243SMP_API extern void smp_set_test_pair_fail_status (BOOLEAN enable, UINT8 status); 244SMP_API extern void smp_remove_fixed_channel_disable (BOOLEAN disable); 245#endif 246/* smp main */ 247extern void smp_sm_event(tSMP_CB *p_cb, tSMP_EVENT event, void *p_data); 248 249extern void smp_proc_sec_request(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 250extern void smp_send_pair_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 251extern void smp_send_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 252extern void smp_send_pair_fail(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 253extern void smp_send_init(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 254extern void smp_proc_sec_request(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 255extern void smp_proc_pair_fail(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 256extern void smp_proc_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 257extern void smp_proc_init(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 258extern void smp_proc_enc_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 259extern void smp_proc_master_id(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 260extern void smp_proc_id_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 261extern void smp_proc_id_addr(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 262extern void smp_proc_sec_grant(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 263extern void smp_proc_sec_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 264extern void smp_proc_sl_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 265extern void smp_start_enc(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 266extern void smp_enc_cmpl(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 267extern void smp_proc_discard(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 268extern void smp_proc_release_delay(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 269extern void smp_proc_release_delay_tout(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 270extern void smp_pairing_cmpl(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 271extern void smp_decide_asso_model(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 272extern void smp_send_app_cback(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 273extern void smp_proc_compare(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 274extern void smp_check_auth_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 275extern void smp_proc_io_rsp(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 276extern void smp_send_id_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 277extern void smp_send_enc_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 278extern void smp_send_csrk_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 279extern void smp_send_ltk_reply(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 280extern void smp_proc_pair_cmd(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 281extern void smp_pair_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 282extern void smp_idle_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 283extern void smp_send_pair_rsp(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 284extern void smp_key_distribution(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 285extern void smp_proc_srk_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 286extern void smp_generate_csrk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 287/* smp_l2c */ 288extern void smp_l2cap_if_init (void); 289 290/* smp utility */ 291extern BOOLEAN smp_send_cmd(UINT8 cmd_code, tSMP_CB *p_cb); 292extern void smp_cb_cleanup(tSMP_CB *p_cb); 293extern void smp_reset_control_value(tSMP_CB *p_cb); 294extern void smp_proc_pairing_cmpl(tSMP_CB *p_cb); 295extern void smp_convert_string_to_tk(BT_OCTET16 tk, UINT32 passkey); 296extern void smp_mask_enc_key(UINT8 loc_enc_size, UINT8 * p_data); 297extern void smp_rsp_timeout(TIMER_LIST_ENT *p_tle); 298extern void smp_xor_128(BT_OCTET16 a, BT_OCTET16 b); 299extern BOOLEAN smp_encrypt_data (UINT8 *key, UINT8 key_len, 300 UINT8 *plain_text, UINT8 pt_len, 301 tSMP_ENC *p_out); 302/* smp key */ 303extern void smp_generate_confirm (tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 304extern void smp_generate_compare (tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 305extern void smp_generate_stk (tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 306extern void smp_generate_ltk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 307extern void smp_generate_passkey (tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 308extern void smp_genenrate_rand_cont(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 309 310/* smp main util */ 311extern void smp_set_state(tSMP_STATE state); 312extern tSMP_STATE smp_get_state(void); 313 314#endif /* SMP_INT_H */ 315 316