You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
5.7 KiB
137 lines
5.7 KiB
/*
|
|
*
|
|
* Copyright 2019 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License") override;
|
|
* 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 "security/pairing/pairing_handler.h"
|
|
|
|
#include <utility>
|
|
|
|
#include "common/callback.h"
|
|
#include "l2cap/classic/l2cap_classic_module.h"
|
|
#include "security/initial_informations.h"
|
|
#include "security/security_manager_listener.h"
|
|
|
|
namespace bluetooth {
|
|
namespace security {
|
|
|
|
class ISecurityManagerListener;
|
|
|
|
namespace pairing {
|
|
|
|
class ClassicPairingHandler : public PairingHandler {
|
|
public:
|
|
ClassicPairingHandler(
|
|
channel::SecurityManagerChannel* security_manager_channel,
|
|
std::shared_ptr<record::SecurityRecord> record,
|
|
os::Handler* security_handler,
|
|
common::OnceCallback<void(hci::Address, PairingResultOrFailure)> complete_callback,
|
|
UI* user_interface,
|
|
os::Handler* user_interface_handler,
|
|
std::string device_name,
|
|
neighbor::NameDbModule* name_db_module)
|
|
: PairingHandler(security_manager_channel, std::move(record), name_db_module),
|
|
security_handler_(security_handler),
|
|
remote_io_capability_(hci::IoCapability::DISPLAY_YES_NO),
|
|
remote_oob_present_(hci::OobDataPresent::NOT_PRESENT),
|
|
remote_authentication_requirements_(hci::AuthenticationRequirements::DEDICATED_BONDING_MITM_PROTECTION),
|
|
local_io_capability_(hci::IoCapability::DISPLAY_YES_NO),
|
|
local_oob_present_(hci::OobDataPresent::NOT_PRESENT),
|
|
local_authentication_requirements_(hci::AuthenticationRequirements::DEDICATED_BONDING_MITM_PROTECTION),
|
|
complete_callback_(std::move(complete_callback)),
|
|
user_interface_(user_interface),
|
|
user_interface_handler_(user_interface_handler),
|
|
device_name_(std::move(device_name)) {}
|
|
|
|
~ClassicPairingHandler() = default;
|
|
|
|
void Initiate(
|
|
bool locally_initiated,
|
|
hci::IoCapability io_capability,
|
|
hci::AuthenticationRequirements auth_requirements,
|
|
OobData remote_p192_oob_data,
|
|
OobData remote_p256_oob_data) override;
|
|
void Cancel() override;
|
|
|
|
void OnReceive(hci::ChangeConnectionLinkKeyCompleteView packet) override;
|
|
void OnReceive(hci::CentralLinkKeyCompleteView packet) override;
|
|
void OnReceive(hci::PinCodeRequestView packet) override;
|
|
void OnReceive(hci::LinkKeyRequestView packet) override;
|
|
void OnReceive(hci::LinkKeyNotificationView packet) override;
|
|
void OnReceive(hci::IoCapabilityRequestView packet) override;
|
|
void OnReceive(hci::IoCapabilityResponseView packet) override;
|
|
void OnReceive(hci::SimplePairingCompleteView packet) override;
|
|
void OnReceive(hci::ReturnLinkKeysView packet) override;
|
|
void OnReceive(hci::EncryptionChangeView packet) override;
|
|
void OnReceive(hci::EncryptionKeyRefreshCompleteView packet) override;
|
|
void OnReceive(hci::RemoteOobDataRequestView packet) override;
|
|
void OnReceive(hci::UserPasskeyNotificationView packet) override;
|
|
void OnReceive(hci::KeypressNotificationView packet) override;
|
|
void OnReceive(hci::UserConfirmationRequestView packet) override;
|
|
void OnReceive(hci::UserPasskeyRequestView packet) override;
|
|
|
|
void OnPairingPromptAccepted(const bluetooth::hci::AddressWithType& address, bool confirmed) override;
|
|
void OnConfirmYesNo(const bluetooth::hci::AddressWithType& address, bool confirmed) override;
|
|
void OnPasskeyEntry(const bluetooth::hci::AddressWithType& address, uint32_t passkey) override;
|
|
void OnPinEntry(const bluetooth::hci::AddressWithType& address, std::vector<uint8_t> pin) override;
|
|
|
|
void OnNameRequestComplete(hci::Address address, bool success);
|
|
|
|
private:
|
|
void OnUserInput(bool user_input);
|
|
void OnPasskeyInput(uint32_t passkey);
|
|
void NotifyUiDisplayYesNo(uint32_t numeric_value);
|
|
void NotifyUiDisplayYesNo();
|
|
void NotifyUiDisplayPasskey(uint32_t passkey);
|
|
void NotifyUiDisplayPasskeyInput();
|
|
void NotifyUiDisplayPinCodeInput();
|
|
void NotifyUiDisplayCancel();
|
|
void UserClickedYes();
|
|
void UserClickedNo();
|
|
|
|
os::Handler* security_handler_ __attribute__((unused));
|
|
hci::IoCapability remote_io_capability_;
|
|
hci::OobDataPresent remote_oob_present_ __attribute__((unused));
|
|
hci::AuthenticationRequirements remote_authentication_requirements_ __attribute__((unused));
|
|
hci::IoCapability local_io_capability_;
|
|
hci::OobDataPresent local_oob_present_ __attribute__((unused));
|
|
hci::AuthenticationRequirements local_authentication_requirements_ __attribute__((unused));
|
|
OobData remote_p192_oob_data_;
|
|
OobData remote_p256_oob_data_;
|
|
common::OnceCallback<void(hci::Address, PairingResultOrFailure)> complete_callback_;
|
|
UI* user_interface_;
|
|
os::Handler* user_interface_handler_;
|
|
std::string device_name_;
|
|
bool is_cancelled_ = false;
|
|
|
|
bool has_gotten_io_cap_response_ = false;
|
|
bool has_gotten_name_response_ = false;
|
|
std::optional<hci::UserConfirmationRequestView> user_confirmation_request_ = std::nullopt;
|
|
std::optional<hci::LinkKeyNotificationView> link_key_notification_ = std::nullopt;
|
|
|
|
hci::ErrorCode last_status_ = hci::ErrorCode::UNKNOWN_HCI_COMMAND;
|
|
bool locally_initiated_ = false;
|
|
uint32_t passkey_ = 0;
|
|
bool already_link_key_replied_ = false;
|
|
bool secure_connections_enabled_ = true;
|
|
bool is_legacy_pin_code_ = false;
|
|
};
|
|
|
|
} // namespace pairing
|
|
} // namespace security
|
|
} // namespace bluetooth
|