| /****************************************************************************** |
| * |
| * Copyright 2021 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at: |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| ******************************************************************************/ |
| |
| |
| /****************************************************************************** |
| * |
| * This file contains BTA CSIP Client internal definitions |
| * |
| ******************************************************************************/ |
| |
| #ifndef BTA_CSIP_INT_H |
| #define BTA_CSIP_INT_H |
| |
| #include "bta_csip_api.h" |
| #include "bta_gatt_api.h" |
| #include "bta_sys.h" |
| #include "btm_ble_api_types.h" |
| |
| /* Max CSIP supported devices (control blocks) */ |
| #define BTA_CSIP_MAX_DEVICE 32 |
| |
| /* Max CSIP supported coordinated sets */ |
| #define BTA_MAX_SUPPORTED_SETS 16 |
| |
| /* Maximum number of apps that can be registered with CSIP*/ |
| #define BTA_CSIP_MAX_SUPPORTED_APPS 16 |
| |
| /* Max Supported coordinated sets per device*/ |
| #define MAX_SUPPORTED_SETS_PER_DEVICE 5 |
| |
| /* Status of the CSIS Discovery*/ |
| #define BTA_CSIP_DISC_SUCCESS 0 |
| #define BTA_CSIP_INVALID_SIRK_FORMAT 1 |
| #define BTA_CSIP_INVALID_KEY 2 |
| #define BTA_CSIP_INVALID_KEY_TYPE 3 |
| #define BTA_CSIP_ALL_MEMBERS_DISCOVERED 4 |
| #define BTA_CSIP_RSRC_EXHAUSTED 5 |
| |
| using bluetooth::Uuid; |
| |
| /* state machine events, these events are handled by the state machine */ |
| enum { |
| BTA_CSIP_API_OPEN_EVT = BTA_SYS_EVT_START(BTA_ID_GROUP), |
| BTA_CSIP_API_CLOSE_EVT, |
| BTA_CSIP_GATT_OPEN_EVT, |
| BTA_CSIP_GATT_CLOSE_EVT, |
| BTA_CSIP_OPEN_FAIL_EVT, |
| BTA_CSIP_OPEN_CMPL_EVT, |
| BTA_CSIP_START_ENC_EVT, |
| BTA_CSIP_ENC_CMPL_EVT, |
| BTA_CSIP_GATT_ENC_CMPL_EVT, |
| |
| /* common events: not handled by execute state machine */ |
| BTA_CSIP_API_ENABLE_EVT, |
| BTA_CSIP_API_DISABLE_EVT, |
| BTA_CSIP_DISC_CMPL_EVT, |
| BTA_CSIP_SET_LOCK_VALUE_EVT, |
| }; |
| |
| /* CSIP device state machine states */ |
| enum { |
| BTA_CSIP_IDLE_ST, |
| BTA_CSIP_W4_CONN_ST, |
| BTA_CSIP_W4_SEC, |
| BTA_CSIP_CONN_ST, |
| BTA_CSIP_DISCONNECTING_ST, |
| }; |
| |
| typedef uint8_t tBTA_CSIP_STATE; |
| |
| |
| /* CSIP Command request parameters in BTA */ |
| |
| /* Find Coordinated set parameters*/ |
| typedef struct { |
| BT_HDR hdr; |
| uint16_t conn_id; |
| tGATT_STATUS status; |
| RawAddress addr; |
| } tBTA_CSIP_DISC_SET; |
| |
| /* Connection Request parameters */ |
| typedef struct { |
| BT_HDR hdr; |
| RawAddress bd_addr; |
| uint8_t app_id; |
| } tBTA_CSIP_API_CONN; |
| |
| /* Lock request parameters */ |
| typedef struct { |
| BT_HDR hdr; |
| tBTA_SET_LOCK_PARAMS lock_req; |
| } tBTA_CSIP_LOCK_PARAMS; |
| |
| |
| typedef struct { |
| BT_HDR hdr; |
| tBTA_CSIP_CBACK* p_csip_cb; |
| tBTA_CSIP_CLT_REG_CB* reg_cb; |
| } tBTA_CSIP_APP_REG_PARAMS; |
| |
| typedef struct { |
| BT_HDR hdr; |
| tBTA_CSIP_CBACK *p_cback; |
| } tBTA_CSIP_ENABLE; |
| |
| typedef struct { |
| BT_HDR hdr; |
| } tBTA_CSIP_CMD; |
| |
| typedef union { |
| BT_HDR hdr; |
| tBTA_CSIP_API_CONN conn_param; |
| tBTA_CSIP_LOCK_PARAMS lock_req; |
| tBTA_CSIP_APP_REG_PARAMS reg_param; |
| tBTA_CSIP_ENABLE enable_param; |
| tBTA_GATTC_OPEN gatt_open_param; |
| tBTA_GATTC_CLOSE gatt_close_param; |
| tBTA_CSIP_CMD cmd; |
| } tBTA_CSIP_REQ_DATA; |
| |
| typedef struct { |
| bool in_use; |
| uint8_t set_id = BTA_MAX_SUPPORTED_SETS; |
| uint16_t conn_id; /* GATT conn_id used for service discovery */ |
| RawAddress bd_addr; |
| |
| uint16_t service_handle; /* Handle of this CSIS service */ |
| uint16_t sirk_handle; /* SIRK characteristic value handle */ |
| uint16_t size_handle; /* size characteristic value handle */ |
| uint16_t lock_handle; /* lock characteristic value handle */ |
| uint16_t rank_handle; /* rank characteristic value handle */ |
| |
| uint16_t sirk_ccd_handle; /* SIRK CCCD handle*/ |
| uint16_t size_ccd_handle; /* size CCCD handle */ |
| uint16_t lock_ccd_handle; /* lock CCCD handle */ |
| |
| uint8_t sirk[SIRK_SIZE]; /* Coordinated set SIRK */ |
| uint8_t size; /* size of the coordinated set */ |
| uint8_t lock; /* lock status of the set member */ |
| uint8_t rank; /* rank of the set member*/ |
| uint8_t discovery_status = BTA_CSIP_DISC_SUCCESS; /* status of the CSIS discovery*/ |
| bluetooth::Uuid including_srvc_uuid; /* uuid of the service which includes CSIS*/ |
| |
| /* Lock mamangement details*/ |
| std::vector<uint8_t> lock_applist; /* Apps those have locked this set */ |
| std::vector<uint8_t> unrsp_applist; /* Apps to which unresponsive res is sent */ |
| std::vector<uint8_t> denied_applist; /* Apps to which lock was denied */ |
| } tBTA_CSIS_SRVC_INFO; |
| |
| typedef struct { |
| bool in_use; |
| RawAddress addr; /* Remote device address */ |
| uint16_t conn_id; /* GATT Connection ID */ |
| uint8_t sec_mask = (BTM_SEC_IN_ENCRYPT | BTM_SEC_OUT_ENCRYPT); /* Security Mask for CSIP*/ |
| bool security_pending; |
| bool is_disc_external = false; /* if discovery is started by external App*/ |
| uint8_t state; /* connection state */ |
| uint8_t csis_instance_count; /* number of CSIS instances on remote device */ |
| uint8_t total_instance_disc; /* total number of instances discovered */ |
| |
| /* CSIS services found on remote device*/ |
| tBTA_CSIS_SRVC_INFO csis_srvc[MAX_SUPPORTED_SETS_PER_DEVICE]; |
| |
| // list of applications which initiated CSIP connect for this device |
| std::vector<uint8_t> conn_applist; /* List of Apps that sent connection request*/ |
| std::string set_info = ""; |
| bool unresponsive; /* if remote is unresponsive to GATT request */ |
| } tBTA_CSIP_DEV_CB; |
| |
| typedef struct { |
| uint8_t app_id; |
| uint8_t set_id; |
| uint8_t value; |
| int8_t cur_idx; |
| std::vector<RawAddress> members_addr; |
| } tBTA_LOCK_REQUEST; |
| |
| typedef struct { |
| bool in_use; |
| uint8_t set_id = BTA_MAX_SUPPORTED_SETS; |
| uint8_t sirk[SIRK_SIZE]; |
| uint16_t set_member_tout = 500; |
| bool request_in_progress; |
| tBTA_CSIP_DEV_CB* cur_dev_cb; |
| alarm_t* unresp_timer; |
| tBTA_LOCK_REQUEST cur_lock_req; |
| tBTA_LOCK_STATUS_CHANGED cur_lock_res; |
| std::map<uint8_t, RawAddress> ordered_members; |
| std::queue<tBTA_SET_LOCK_PARAMS> lock_req_queue; |
| } tBTA_CSET_CB; |
| |
| typedef struct { |
| uint8_t app_id; |
| bool in_use; |
| tBTA_CSIP_CBACK* p_cback; |
| } tBTA_CSIP_RCB; |
| |
| typedef struct { |
| tGATT_IF gatt_if; |
| tBTA_CSIP_CBACK* p_cback; /* callbacks for btif layer */ |
| std::vector<tBTA_CSIP_DEV_CB> dev_cb; /* device control block */ |
| tBTA_CSIP_RCB app_rcb[BTA_CSIP_MAX_SUPPORTED_APPS]; |
| std::vector<tBTA_CSIP_CSET> csets; |
| tBTA_CSET_CB csets_cb[BTA_MAX_SUPPORTED_SETS]; |
| } tBTA_CSIP_CB; |
| |
| /***************************************************************************** |
| * Global data |
| ****************************************************************************/ |
| |
| /* CSIP control block */ |
| extern tBTA_CSIP_CB bta_csip_cb; |
| |
| /***************************************************************************** |
| * Function prototypes |
| ****************************************************************************/ |
| void bta_csip_sm_execute(tBTA_CSIP_DEV_CB* p_cb, uint16_t event, |
| tBTA_CSIP_REQ_DATA* p_data); |
| |
| |
| //action api's |
| extern bool bta_csip_hdl_event(BT_HDR* p_msg); |
| extern void bta_csip_api_enable(tBTA_CSIP_CBACK *p_cback); |
| extern void bta_csip_api_disable(); |
| extern void bta_csip_app_register (const Uuid& app_uuid, tBTA_CSIP_CBACK* p_cback, |
| BtaCsipAppRegisteredCb cb); |
| extern void bta_csip_gattc_register(); |
| extern void bta_csip_app_unregister(uint8_t app_id); |
| extern void bta_csip_gatt_disc_cmpl_act(tBTA_CSIP_DISC_SET *disc_params); |
| extern void bta_csip_api_open_act (tBTA_CSIP_DEV_CB* p_cb, tBTA_CSIP_REQ_DATA* p_data); |
| extern void bta_csip_api_close_act (tBTA_CSIP_DEV_CB* p_cb, tBTA_CSIP_REQ_DATA* p_data); |
| extern void bta_csip_gatt_open_act (tBTA_CSIP_DEV_CB* p_cb, tBTA_CSIP_REQ_DATA* p_data); |
| extern void bta_csip_gatt_close_act (tBTA_CSIP_DEV_CB* p_cb, tBTA_CSIP_REQ_DATA* p_data); |
| extern void bta_csip_gatt_open_fail_act (tBTA_CSIP_DEV_CB* p_cb, tBTA_CSIP_REQ_DATA* p_data); |
| extern void bta_csip_open_cmpl_act (tBTA_CSIP_DEV_CB* p_cb, tBTA_CSIP_REQ_DATA* p_data); |
| extern void bta_csip_start_sec_act (tBTA_CSIP_DEV_CB* p_cb, tBTA_CSIP_REQ_DATA* p_data); |
| extern void bta_csip_sec_cmpl_act (tBTA_CSIP_DEV_CB* p_cb, tBTA_CSIP_REQ_DATA* p_data); |
| extern void bta_csip_close_csip_conn (tBTA_CSIP_DEV_CB* p_cb); |
| extern void bta_csip_process_set_lock_act(tBTA_SET_LOCK_PARAMS lock_req); |
| extern void bta_csip_send_lock_req_act(tBTA_CSET_CB* cset_cb); |
| extern void bta_csip_handle_lock_denial(tBTA_CSET_CB* cset_cb); |
| extern bool bta_csip_validate_req_for_denied_sm (tBTA_CSET_CB* cset_cb); |
| extern void bta_csip_form_lock_request(tBTA_SET_LOCK_PARAMS lock_param, |
| tBTA_CSET_CB* cset_cb); |
| extern void bta_csip_send_unlock_req_act(tBTA_CSET_CB* cset_cb); |
| extern void bta_csip_set_member_lock_timeout(void* p_data); |
| extern void bta_csip_load_coordinated_sets_from_storage(); |
| |
| // bta_csip_utils |
| extern tBTA_CSIP_DEV_CB* bta_csip_find_dev_cb_by_bda(const RawAddress& bda); |
| extern tBTA_CSIP_DEV_CB* bta_csip_get_dev_cb_by_cid(uint16_t conn_id); |
| extern tBTA_CSIP_DEV_CB* bta_csip_create_dev_cb_for_bda(const RawAddress& bda); |
| extern tBTA_CSIS_SRVC_INFO* bta_csip_get_csis_service_cb(tBTA_CSIP_DEV_CB* dev_cb); |
| extern bool bta_csip_is_csis_supported(tBTA_CSIP_DEV_CB* dev_cb); |
| extern tBTA_CSIS_SRVC_INFO* bta_csip_get_csis_service_by_handle(tBTA_CSIP_DEV_CB* dev_cb, |
| uint16_t service_handle); |
| extern tBTA_CSIS_SRVC_INFO* bta_csip_find_csis_srvc_by_lock_handle(tBTA_CSIP_DEV_CB* dev_cb, |
| uint16_t lock_handle); |
| extern tBTA_CSIP_CSET* bta_csip_get_or_create_cset (uint8_t set_id, bool existing); |
| extern bool bta_csip_validate_set_params(tBTA_SET_LOCK_PARAMS* lock_req); |
| extern bool bta_csip_is_valid_lock_request(tBTA_SET_LOCK_PARAMS* lock_req); |
| extern std::vector<RawAddress> bta_csip_arrange_set_members_by_order( |
| uint8_t set_id, std::vector<RawAddress>& req_sm, bool ascending); |
| extern tBTA_CSIP_CSET bta_csip_get_coordinated_set (uint8_t set_id); |
| extern bool bta_csip_update_set_member (uint8_t set_id, RawAddress addr); |
| extern tBTA_CSET_CB* bta_csip_get_cset_cb (); |
| extern tBTA_CSET_CB* bta_csip_get_cset_cb_by_id (uint8_t set_id); |
| extern uint8_t bta_csip_find_set_id_by_sirk (uint8_t* sirk); |
| extern tBTA_CSIS_SRVC_INFO* bta_csip_get_csis_instance(tBTA_CSIP_DEV_CB* dev_cb, uint8_t set_id); |
| extern bool bta_csip_is_locked_by_other_apps(tBTA_CSIS_SRVC_INFO* srvc, uint8_t app_id); |
| extern std::vector<RawAddress> bta_csip_get_set_member_by_order(uint8_t set_id, |
| bool ascending); |
| extern bool bta_csip_is_member_locked_by_app (uint8_t app_id, tBTA_CSIS_SRVC_INFO* srvc); |
| extern void bta_csip_get_next_lock_request(tBTA_CSET_CB* cset_cb); |
| extern uint16_t bta_csip_get_cccd_handle (uint16_t conn_id, uint16_t char_handle); |
| extern bool bta_csip_is_app_reg(uint8_t app_id); |
| extern tBTA_CSIP_RCB* bta_csip_get_rcb (uint8_t app_id); |
| extern void bta_csip_remove_set_member (RawAddress addr); |
| extern void bta_csip_handle_notification(tBTA_GATTC_NOTIFY* ntf); |
| extern void bta_csip_handle_lock_value_notif(tBTA_CSIP_DEV_CB* p_cb, |
| uint16_t handle, uint8_t value); |
| extern void bta_csip_add_app_to_applist(tBTA_CSIP_DEV_CB* p_cb, uint8_t app_id); |
| extern void bta_csip_handle_unresponsive_sm_res(tBTA_CSIS_SRVC_INFO* srvc, |
| tGATT_STATUS status); |
| extern void bta_csip_remove_app_from_conn_list(tBTA_CSIP_DEV_CB* p_cb, uint8_t app_id); |
| extern bool bta_csip_is_app_from_applist(tBTA_CSIP_DEV_CB* p_cb, uint8_t app_id); |
| extern void bta_csip_send_conn_state_changed_cb(tBTA_CSIP_DEV_CB* p_cb, |
| uint8_t state, uint8_t status); |
| extern void bta_csip_send_conn_state_changed_cb (tBTA_CSIP_DEV_CB* p_cb, uint8_t app_id, |
| uint8_t state, uint8_t status); |
| extern void bta_csip_send_lock_req_cmpl_cb (tBTA_LOCK_STATUS_CHANGED cset_cb); |
| extern void bta_csip_write_cccd (tBTA_CSIP_DEV_CB* p_cb, uint16_t char_handle, |
| uint16_t cccd_handle); |
| extern void bta_csip_preserve_cset (tBTA_CSIS_SRVC_INFO* srvc); |
| extern Octet16 bta_csip_get_salt(); |
| extern Octet16 bta_csip_compute_T(Octet16 salt, Octet16 K); |
| extern Octet16 bta_csip_compute_k1(Octet16 T); |
| extern void bta_csip_get_decrypted_sirk(Octet16 k1, uint8_t *enc_sirk, uint8_t *sirk); |
| extern Octet16 bta_csip_get_aes_cmac_result(const Octet16& key, const Octet16& message); |
| extern Octet16 bta_csip_get_aes_cmac_result(const Octet16& key, const uint8_t* input, |
| uint16_t length); |
| extern void hex_string_to_byte_arr(char *str, uint8_t* byte_arr, uint8_t len); |
| extern void byte_arr_to_hex_string(uint8_t* byte_arr, char* str, uint8_t len); |
| extern bool is_key_empty(Octet16& key); |
| #endif |