/* * Copyright 2023 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. * */ #pragma once #include #include "internal_include/bt_target.h" #include "osi/include/alarm.h" #include "osi/include/fixed_queue.h" #include "osi/include/list.h" #include "stack/btm/btm_sec_int_types.h" #include "stack/btm/security_device_record.h" #include "stack/include/bt_octets.h" #include "stack/include/security_client_callbacks.h" #include "types/raw_address.h" class tBTM_SEC_CB { public: tBTM_CFG cfg; /* Device configuration */ /***************************************************** ** Local Device control block (on security) *****************************************************/ tBTM_SEC_DEVCB devcb; uint16_t enc_handle{0}; BT_OCTET8 enc_rand; /* received rand value from LTK request*/ uint16_t ediv{0}; /* received ediv value from LTK request */ uint8_t key_size{0}; public: /***************************************************** ** Security Management *****************************************************/ tBTM_APPL_INFO api; tBTM_SEC_DEV_REC* p_collided_dev_rec{nullptr}; alarm_t* sec_collision_timer{nullptr}; uint64_t collision_start_time{0}; uint32_t dev_rec_count{0}; /* Counter used for device record timestamp */ uint8_t security_mode{0}; bool pairing_disabled{false}; bool security_mode_changed{false}; /* mode changed during bonding */ bool pin_type_changed{false}; /* pin type changed during bonding */ bool sec_req_pending{false}; /* true if a request is pending */ uint8_t pin_code_len{0}; /* for legacy devices */ PIN_CODE pin_code; /* for legacy devices */ tBTM_PAIRING_STATE pairing_state{ BTM_PAIR_STATE_IDLE}; /* The current pairing state */ uint8_t pairing_flags{0}; /* The current pairing flags */ RawAddress pairing_bda; /* The device currently pairing */ alarm_t* pairing_timer{nullptr}; /* Timer for pairing process */ alarm_t* execution_wait_timer{nullptr}; /* To avoid concurrent auth request */ list_t* sec_dev_rec{nullptr}; /* list of tBTM_SEC_DEV_REC */ tBTM_SEC_SERV_REC* p_out_serv{nullptr}; tBTM_MKEY_CALLBACK* mkey_cback{nullptr}; RawAddress connecting_bda; fixed_queue_t* sec_pending_q{nullptr}; /* pending sequrity requests in tBTM_SEC_QUEUE_ENTRY format */ tBTM_SEC_SERV_REC sec_serv_rec[BTM_SEC_MAX_SERVICE_RECORDS]; DEV_CLASS connecting_dc; void Init(uint8_t initial_security_mode); void Free(); tBTM_SEC_SERV_REC* find_first_serv_rec(bool is_originator, uint16_t psm); bool IsDeviceBonded(const RawAddress bd_addr); bool IsDeviceEncrypted(const RawAddress bd_addr, tBT_TRANSPORT transport); bool IsDeviceAuthenticated(const RawAddress bd_addr, tBT_TRANSPORT transport); bool IsLinkKeyAuthenticated(const RawAddress bd_addr, tBT_TRANSPORT transport); bool IsLinkKeyKnown(const RawAddress bd_addr, tBT_TRANSPORT transport); tBTM_SEC_REC* getSecRec(const RawAddress bd_addr); bool AddService(bool is_originator, const char* p_name, uint8_t service_id, uint16_t sec_level, uint16_t psm, uint32_t mx_proto_id, uint32_t mx_chan_id); uint8_t RemoveServiceById(uint8_t service_id); uint8_t RemoveServiceByPsm(uint16_t psm); void change_pairing_state(tBTM_PAIRING_STATE new_state); // misc static methods static const char* btm_pair_state_descr(tBTM_PAIRING_STATE state); }; extern tBTM_SEC_CB btm_sec_cb; void BTM_Sec_Init(); void BTM_Sec_Free();