blob: 0a827c1dc2d7f08fcba1514f0f43e5349adb189f [file] [log] [blame]
/*
* 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 <cstdint>
#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();