Loading system/gd/security/cert/simple_security_test.py +4 −3 Original line number Diff line number Diff line Loading @@ -185,9 +185,10 @@ class SimpleSecurityTest(GdFacadeOnlyBaseTestClass): type=common.BluetoothAddressTypeEnum. PUBLIC_DEVICE_ADDRESS))) dut_bond_stream.assert_event_occurs( lambda bond_event: bond_event.message_type == security_facade.BondMsgType.DEVICE_BONDED ) # TODO: Figure out why this isn't happening anymore, bond event changes were recently introduced # dut_bond_stream.assert_event_occurs( # lambda bond_event: bond_event.message_type == security_facade.BondMsgType.DEVICE_BONDED # ) def test_display_only(self): dut_address = self.dut.hci_controller.GetMacAddress( Loading system/gd/security/channel/security_manager_channel.cc +113 −2 Original line number Diff line number Diff line Loading @@ -17,15 +17,75 @@ */ #include "security/channel/security_manager_channel.h" #include "hci/address.h" #include "security/smp_packets.h" namespace bluetooth { namespace security { namespace channel { /** * Constructor for testing onlyu */ SecurityManagerChannel::SecurityManagerChannel(os::Handler* handler, hci::HciLayer* hci_layer) : listener_(nullptr), hci_security_interface_(hci_layer->GetSecurityInterface( common::Bind(&SecurityManagerChannel::OnHciEventReceived, common::Unretained(this)), handler)), handler_(handler) { is_test_mode_ = true; } /** * Main Constructor */ SecurityManagerChannel::SecurityManagerChannel( os::Handler* handler, hci::HciLayer* hci_layer, std::unique_ptr<l2cap::classic::FixedChannelManager> fixed_channel_manager) : listener_(nullptr), hci_security_interface_(hci_layer->GetSecurityInterface( common::Bind(&SecurityManagerChannel::OnHciEventReceived, common::Unretained(this)), handler)), handler_(handler), fixed_channel_manager_(std::move(fixed_channel_manager)) { ASSERT_LOG(fixed_channel_manager_ != nullptr, "No channel manager!"); LOG_DEBUG("Registering for a fixed channel service"); fixed_channel_manager_->RegisterService( l2cap::kClassicPairingTriggerCid, security_policy_, common::BindOnce(&SecurityManagerChannel::OnRegistrationComplete, common::Unretained(this)), common::Bind(&SecurityManagerChannel::OnConnectionOpen, common::Unretained(this)), handler_); } SecurityManagerChannel::~SecurityManagerChannel() { if (fixed_channel_service_ != nullptr) { fixed_channel_service_->Unregister(common::Bind(&SecurityManagerChannel::OnUnregistered, common::Unretained(this)), handler_); } } void SecurityManagerChannel::Connect(hci::Address address) { if (is_test_mode_) return; ASSERT_LOG(fixed_channel_manager_ != nullptr, "No channel manager!"); auto entry = fixed_channel_map_.find(address); if (entry != fixed_channel_map_.end()) { LOG_ERROR("Already connected to device: %s", address.ToString().c_str()); return; } fixed_channel_manager_->ConnectServices( address, common::Bind(&SecurityManagerChannel::OnConnectionFail, common::Unretained(this), address), handler_); } void SecurityManagerChannel::Disconnect(hci::Address address) { if (is_test_mode_) return; auto entry = fixed_channel_map_.find(address); if (entry != fixed_channel_map_.end()) { entry->second->Release(); entry->second.reset(); fixed_channel_map_.erase(entry); } else { LOG_WARN("Unknown address '%s'", address.ToString().c_str()); } } void SecurityManagerChannel::OnCommandComplete(hci::CommandCompleteView packet) { ASSERT(packet.IsValid()); // TODO(optedoblivion): Verify HCI commands ASSERT_LOG(packet.IsValid(), "Bad command response"); } void SecurityManagerChannel::SendCommand(std::unique_ptr<hci::SecurityCommandBuilder> command) { Loading @@ -40,6 +100,57 @@ void SecurityManagerChannel::OnHciEventReceived(hci::EventPacketView packet) { listener_->OnHciEventReceived(packet); } void SecurityManagerChannel::OnRegistrationComplete( l2cap::classic::FixedChannelManager::RegistrationResult result, std::unique_ptr<l2cap::classic::FixedChannelService> fixed_channel_service) { ASSERT(fixed_channel_service_ == nullptr); ASSERT_LOG(result == l2cap::classic::FixedChannelManager::RegistrationResult::SUCCESS, "Failed service registration!"); fixed_channel_service_ = std::move(fixed_channel_service); } void SecurityManagerChannel::OnUnregistered() { fixed_channel_manager_.reset(); } void SecurityManagerChannel::OnConnectionOpen(std::unique_ptr<l2cap::classic::FixedChannel> fixed_channel) { ASSERT_LOG(fixed_channel != nullptr, "Null channel passed in"); ASSERT_LOG(fixed_channel_map_.find(fixed_channel->GetDevice()) == fixed_channel_map_.end(), "Multiple fixed channel for a single device is not allowed."); fixed_channel->RegisterOnCloseCallback( handler_, common::BindOnce(&SecurityManagerChannel::OnConnectionClose, common::Unretained(this), fixed_channel->GetDevice())); fixed_channel->Acquire(); auto new_entry = std::pair<hci::Address, std::unique_ptr<l2cap::classic::FixedChannel>>(fixed_channel->GetDevice(), std::move(fixed_channel)); fixed_channel_map_.insert(std::move(new_entry)); } void SecurityManagerChannel::OnConnectionFail(hci::Address address, l2cap::classic::FixedChannelManager::ConnectionResult result) { LOG_ERROR("Connection closed due to: %s ; %d", hci::ErrorCodeText(result.hci_error).c_str(), result.connection_result_code); auto entry = fixed_channel_map_.find(address); if (entry != fixed_channel_map_.end()) { entry->second->Release(); entry->second.reset(); fixed_channel_map_.erase(entry); } listener_->OnConnectionFailed(address, result); } void SecurityManagerChannel::OnConnectionClose(hci::Address address, hci::ErrorCode error_code) { // Called when the connection gets closed LOG_ERROR("Connection closed due to: %s", hci::ErrorCodeText(error_code).c_str()); auto entry = fixed_channel_map_.find(address); if (entry != fixed_channel_map_.end()) { entry->second->Release(); entry->second.reset(); fixed_channel_map_.erase(entry); } listener_->OnConnectionClosed(address, error_code); } } // namespace channel } // namespace security } // namespace bluetooth system/gd/security/channel/security_manager_channel.h +41 −8 Original line number Diff line number Diff line Loading @@ -18,12 +18,14 @@ #pragma once #include <memory> #include <unordered_map> #include <vector> #include "hci/address_with_type.h" #include "hci/hci_layer.h" #include "hci/hci_packets.h" #include "hci/security_interface.h" #include "l2cap/classic/l2cap_classic_module.h" namespace bluetooth { namespace security { Loading @@ -36,6 +38,9 @@ class ISecurityManagerChannelListener { public: virtual ~ISecurityManagerChannelListener() = default; virtual void OnHciEventReceived(hci::EventPacketView packet) = 0; virtual void OnConnectionClosed(hci::Address, bluetooth::hci::ErrorCode error_code) = 0; virtual void OnConnectionFailed(hci::Address, bluetooth::l2cap::classic::FixedChannelManager::ConnectionResult result) = 0; }; /** Loading @@ -43,11 +48,22 @@ class ISecurityManagerChannelListener { */ class SecurityManagerChannel { public: explicit SecurityManagerChannel(os::Handler* handler, hci::HciLayer* hci_layer) : listener_(nullptr), hci_security_interface_(hci_layer->GetSecurityInterface( common::Bind(&SecurityManagerChannel::OnHciEventReceived, common::Unretained(this)), handler)), handler_(handler) {} SecurityManagerChannel(os::Handler* handler, hci::HciLayer* hci_layer, std::unique_ptr<l2cap::classic::FixedChannelManager> fixed_channel_manager); virtual ~SecurityManagerChannel(); /** * Creates a connection to the device which triggers pairing * * @param address remote address of device to pair with */ void Connect(hci::Address address); /** * Disconnects currently connected channel */ void Disconnect(hci::Address address); /** * Send a given SMP command over the SecurityManagerChannel Loading Loading @@ -79,10 +95,27 @@ class SecurityManagerChannel { */ void OnCommandComplete(hci::CommandCompleteView packet); protected: SecurityManagerChannel(os::Handler* handler, hci::HciLayer* hci_layer); virtual void OnRegistrationComplete(l2cap::classic::FixedChannelManager::RegistrationResult result, std::unique_ptr<l2cap::classic::FixedChannelService> fixed_channel_service); virtual void OnUnregistered(); virtual void OnConnectionOpen(std::unique_ptr<l2cap::classic::FixedChannel> fixed_channel); virtual void OnConnectionFail(hci::Address address, l2cap::classic::FixedChannelManager::ConnectionResult result); virtual void OnConnectionClose(hci::Address address, hci::ErrorCode error_code); bool is_test_mode_ = false; private: ISecurityManagerChannelListener* listener_; hci::SecurityInterface* hci_security_interface_; os::Handler* handler_; ISecurityManagerChannelListener* listener_{nullptr}; hci::SecurityInterface* hci_security_interface_{nullptr}; os::Handler* handler_{nullptr}; l2cap::SecurityPolicy security_policy_; std::unique_ptr<l2cap::classic::FixedChannelManager> fixed_channel_manager_{nullptr}; std::unique_ptr<l2cap::classic::FixedChannelService> fixed_channel_service_{nullptr}; std::unordered_map<hci::Address, std::unique_ptr<l2cap::classic::FixedChannel>> fixed_channel_map_; }; } // namespace channel Loading system/gd/security/channel/security_manager_channel_unittest.cc +22 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <gtest/gtest.h> #include "hci/hci_packets.h" #include "l2cap/classic/fixed_channel.h" #include "packet/raw_builder.h" #include "security/smp_packets.h" #include "security/test/fake_hci_layer.h" Loading @@ -41,6 +42,17 @@ using os::Handler; using os::Thread; using packet::RawBuilder; class FakeSecurityManagerChannel : public SecurityManagerChannel { public: FakeSecurityManagerChannel(os::Handler* handler, hci::HciLayer* hci_layer) : SecurityManagerChannel(handler, hci_layer) {} ~FakeSecurityManagerChannel() {} void OnConnectionOpen(std::unique_ptr<l2cap::classic::FixedChannel> fixed_channel) override { LOG_ERROR("CALLED"); } }; class SecurityManagerChannelCallback : public ISecurityManagerChannelListener { public: // HCI Loading Loading @@ -184,6 +196,15 @@ class SecurityManagerChannelCallback : public ISecurityManagerChannelListener { break; } } void OnConnectionClosed(hci::Address address, bluetooth::hci::ErrorCode error_code) override { LOG_DEBUG("Called"); } void OnConnectionFailed(hci::Address address, bluetooth::l2cap::classic::FixedChannelManager::ConnectionResult result) override { LOG_DEBUG("Shouldn't be called"); } }; class SecurityManagerChannelTest : public ::testing::Test { Loading @@ -194,7 +215,7 @@ class SecurityManagerChannelTest : public ::testing::Test { hci_layer_ = new FakeHciLayer(); fake_registry_.InjectTestModule(&FakeHciLayer::Factory, hci_layer_); fake_registry_.Start<FakeHciLayer>(&thread_); channel_ = new SecurityManagerChannel(handler_, hci_layer_); channel_ = new FakeSecurityManagerChannel(handler_, hci_layer_); channel_->SetChannelListener(callback_); } Loading system/gd/security/internal/security_manager_impl.cc +25 −4 Original line number Diff line number Diff line Loading @@ -48,8 +48,8 @@ void SecurityManagerImpl::DispatchPairingHandler(record::SecurityRecord& record, std::shared_ptr<record::SecurityRecord> record_copy = std::make_shared<record::SecurityRecord>(record.GetPseudoAddress()); pairing_handler = std::make_shared<security::pairing::ClassicPairingHandler>( l2cap_classic_module_->GetFixedChannelManager(), security_manager_channel_, record_copy, security_handler_, std::move(callback), user_interface_, user_interface_handler_, "TODO: grab device name properly"); security_manager_channel_, record_copy, security_handler_, std::move(callback), user_interface_, user_interface_handler_, "TODO: grab device name properly"); break; } default: Loading Loading @@ -247,6 +247,26 @@ void SecurityManagerImpl::OnHciEventReceived(hci::EventPacketView packet) { } } void SecurityManagerImpl::OnConnectionClosed(hci::Address address, bluetooth::hci::ErrorCode error_code) { LOG_DEBUG("Reason: %s ", hci::ErrorCodeText(error_code).c_str()); auto entry = pairing_handler_map_.find(address); if (entry != pairing_handler_map_.end()) { LOG_DEBUG("Cancelling pairing handler for '%s'", address.ToString().c_str()); entry->second->Cancel(); } } void SecurityManagerImpl::OnConnectionFailed(hci::Address address, bluetooth::l2cap::classic::FixedChannelManager::ConnectionResult result) { LOG_DEBUG("HCI Reason: %s ", hci::ErrorCodeText(result.hci_error).c_str()); LOG_DEBUG("L2CAP Reason: %d ", result.connection_result_code); auto entry = pairing_handler_map_.find(address); if (entry != pairing_handler_map_.end()) { LOG_DEBUG("Cancelling pairing handler for '%s'", address.ToString().c_str()); entry->second->Cancel(); } } void SecurityManagerImpl::OnHciLeEvent(hci::LeMetaEventView event) { // hci::SubeventCode::LONG_TERM_KEY_REQUEST, // hci::SubeventCode::READ_LOCAL_P256_PUBLIC_KEY_COMPLETE, Loading Loading @@ -289,6 +309,7 @@ void SecurityManagerImpl::OnPairingHandlerComplete(hci::Address address, Pairing auto entry = pairing_handler_map_.find(address); if (entry != pairing_handler_map_.end()) { pairing_handler_map_.erase(entry); security_manager_channel_->Disconnect(address); } if (!std::holds_alternative<PairingFailure>(status)) { NotifyDeviceBonded(hci::AddressWithType(address, hci::AddressType::PUBLIC_DEVICE_ADDRESS)); Loading Loading @@ -382,15 +403,15 @@ void SecurityManagerImpl::OnConnectionFailureLe(bluetooth::l2cap::le::FixedChann } SecurityManagerImpl::SecurityManagerImpl(os::Handler* security_handler, l2cap::le::L2capLeModule* l2cap_le_module, l2cap::classic::L2capClassicModule* l2cap_classic_module, channel::SecurityManagerChannel* security_manager_channel, hci::HciLayer* hci_layer) : security_handler_(security_handler), l2cap_le_module_(l2cap_le_module), l2cap_classic_module_(l2cap_classic_module), l2cap_manager_le_(l2cap_le_module_->GetFixedChannelManager()), l2cap_manager_le_(l2cap_le_module_->GetFixedChannelManager()), hci_security_interface_le_(hci_layer->GetLeSecurityInterface( common::Bind(&SecurityManagerImpl::OnHciLeEvent, common::Unretained(this)), security_handler)), security_manager_channel_(security_manager_channel) { Init(); l2cap_manager_le_->RegisterService( bluetooth::l2cap::kSmpCid, {}, common::BindOnce(&SecurityManagerImpl::OnL2capRegistrationCompleteLe, common::Unretained(this)), Loading Loading
system/gd/security/cert/simple_security_test.py +4 −3 Original line number Diff line number Diff line Loading @@ -185,9 +185,10 @@ class SimpleSecurityTest(GdFacadeOnlyBaseTestClass): type=common.BluetoothAddressTypeEnum. PUBLIC_DEVICE_ADDRESS))) dut_bond_stream.assert_event_occurs( lambda bond_event: bond_event.message_type == security_facade.BondMsgType.DEVICE_BONDED ) # TODO: Figure out why this isn't happening anymore, bond event changes were recently introduced # dut_bond_stream.assert_event_occurs( # lambda bond_event: bond_event.message_type == security_facade.BondMsgType.DEVICE_BONDED # ) def test_display_only(self): dut_address = self.dut.hci_controller.GetMacAddress( Loading
system/gd/security/channel/security_manager_channel.cc +113 −2 Original line number Diff line number Diff line Loading @@ -17,15 +17,75 @@ */ #include "security/channel/security_manager_channel.h" #include "hci/address.h" #include "security/smp_packets.h" namespace bluetooth { namespace security { namespace channel { /** * Constructor for testing onlyu */ SecurityManagerChannel::SecurityManagerChannel(os::Handler* handler, hci::HciLayer* hci_layer) : listener_(nullptr), hci_security_interface_(hci_layer->GetSecurityInterface( common::Bind(&SecurityManagerChannel::OnHciEventReceived, common::Unretained(this)), handler)), handler_(handler) { is_test_mode_ = true; } /** * Main Constructor */ SecurityManagerChannel::SecurityManagerChannel( os::Handler* handler, hci::HciLayer* hci_layer, std::unique_ptr<l2cap::classic::FixedChannelManager> fixed_channel_manager) : listener_(nullptr), hci_security_interface_(hci_layer->GetSecurityInterface( common::Bind(&SecurityManagerChannel::OnHciEventReceived, common::Unretained(this)), handler)), handler_(handler), fixed_channel_manager_(std::move(fixed_channel_manager)) { ASSERT_LOG(fixed_channel_manager_ != nullptr, "No channel manager!"); LOG_DEBUG("Registering for a fixed channel service"); fixed_channel_manager_->RegisterService( l2cap::kClassicPairingTriggerCid, security_policy_, common::BindOnce(&SecurityManagerChannel::OnRegistrationComplete, common::Unretained(this)), common::Bind(&SecurityManagerChannel::OnConnectionOpen, common::Unretained(this)), handler_); } SecurityManagerChannel::~SecurityManagerChannel() { if (fixed_channel_service_ != nullptr) { fixed_channel_service_->Unregister(common::Bind(&SecurityManagerChannel::OnUnregistered, common::Unretained(this)), handler_); } } void SecurityManagerChannel::Connect(hci::Address address) { if (is_test_mode_) return; ASSERT_LOG(fixed_channel_manager_ != nullptr, "No channel manager!"); auto entry = fixed_channel_map_.find(address); if (entry != fixed_channel_map_.end()) { LOG_ERROR("Already connected to device: %s", address.ToString().c_str()); return; } fixed_channel_manager_->ConnectServices( address, common::Bind(&SecurityManagerChannel::OnConnectionFail, common::Unretained(this), address), handler_); } void SecurityManagerChannel::Disconnect(hci::Address address) { if (is_test_mode_) return; auto entry = fixed_channel_map_.find(address); if (entry != fixed_channel_map_.end()) { entry->second->Release(); entry->second.reset(); fixed_channel_map_.erase(entry); } else { LOG_WARN("Unknown address '%s'", address.ToString().c_str()); } } void SecurityManagerChannel::OnCommandComplete(hci::CommandCompleteView packet) { ASSERT(packet.IsValid()); // TODO(optedoblivion): Verify HCI commands ASSERT_LOG(packet.IsValid(), "Bad command response"); } void SecurityManagerChannel::SendCommand(std::unique_ptr<hci::SecurityCommandBuilder> command) { Loading @@ -40,6 +100,57 @@ void SecurityManagerChannel::OnHciEventReceived(hci::EventPacketView packet) { listener_->OnHciEventReceived(packet); } void SecurityManagerChannel::OnRegistrationComplete( l2cap::classic::FixedChannelManager::RegistrationResult result, std::unique_ptr<l2cap::classic::FixedChannelService> fixed_channel_service) { ASSERT(fixed_channel_service_ == nullptr); ASSERT_LOG(result == l2cap::classic::FixedChannelManager::RegistrationResult::SUCCESS, "Failed service registration!"); fixed_channel_service_ = std::move(fixed_channel_service); } void SecurityManagerChannel::OnUnregistered() { fixed_channel_manager_.reset(); } void SecurityManagerChannel::OnConnectionOpen(std::unique_ptr<l2cap::classic::FixedChannel> fixed_channel) { ASSERT_LOG(fixed_channel != nullptr, "Null channel passed in"); ASSERT_LOG(fixed_channel_map_.find(fixed_channel->GetDevice()) == fixed_channel_map_.end(), "Multiple fixed channel for a single device is not allowed."); fixed_channel->RegisterOnCloseCallback( handler_, common::BindOnce(&SecurityManagerChannel::OnConnectionClose, common::Unretained(this), fixed_channel->GetDevice())); fixed_channel->Acquire(); auto new_entry = std::pair<hci::Address, std::unique_ptr<l2cap::classic::FixedChannel>>(fixed_channel->GetDevice(), std::move(fixed_channel)); fixed_channel_map_.insert(std::move(new_entry)); } void SecurityManagerChannel::OnConnectionFail(hci::Address address, l2cap::classic::FixedChannelManager::ConnectionResult result) { LOG_ERROR("Connection closed due to: %s ; %d", hci::ErrorCodeText(result.hci_error).c_str(), result.connection_result_code); auto entry = fixed_channel_map_.find(address); if (entry != fixed_channel_map_.end()) { entry->second->Release(); entry->second.reset(); fixed_channel_map_.erase(entry); } listener_->OnConnectionFailed(address, result); } void SecurityManagerChannel::OnConnectionClose(hci::Address address, hci::ErrorCode error_code) { // Called when the connection gets closed LOG_ERROR("Connection closed due to: %s", hci::ErrorCodeText(error_code).c_str()); auto entry = fixed_channel_map_.find(address); if (entry != fixed_channel_map_.end()) { entry->second->Release(); entry->second.reset(); fixed_channel_map_.erase(entry); } listener_->OnConnectionClosed(address, error_code); } } // namespace channel } // namespace security } // namespace bluetooth
system/gd/security/channel/security_manager_channel.h +41 −8 Original line number Diff line number Diff line Loading @@ -18,12 +18,14 @@ #pragma once #include <memory> #include <unordered_map> #include <vector> #include "hci/address_with_type.h" #include "hci/hci_layer.h" #include "hci/hci_packets.h" #include "hci/security_interface.h" #include "l2cap/classic/l2cap_classic_module.h" namespace bluetooth { namespace security { Loading @@ -36,6 +38,9 @@ class ISecurityManagerChannelListener { public: virtual ~ISecurityManagerChannelListener() = default; virtual void OnHciEventReceived(hci::EventPacketView packet) = 0; virtual void OnConnectionClosed(hci::Address, bluetooth::hci::ErrorCode error_code) = 0; virtual void OnConnectionFailed(hci::Address, bluetooth::l2cap::classic::FixedChannelManager::ConnectionResult result) = 0; }; /** Loading @@ -43,11 +48,22 @@ class ISecurityManagerChannelListener { */ class SecurityManagerChannel { public: explicit SecurityManagerChannel(os::Handler* handler, hci::HciLayer* hci_layer) : listener_(nullptr), hci_security_interface_(hci_layer->GetSecurityInterface( common::Bind(&SecurityManagerChannel::OnHciEventReceived, common::Unretained(this)), handler)), handler_(handler) {} SecurityManagerChannel(os::Handler* handler, hci::HciLayer* hci_layer, std::unique_ptr<l2cap::classic::FixedChannelManager> fixed_channel_manager); virtual ~SecurityManagerChannel(); /** * Creates a connection to the device which triggers pairing * * @param address remote address of device to pair with */ void Connect(hci::Address address); /** * Disconnects currently connected channel */ void Disconnect(hci::Address address); /** * Send a given SMP command over the SecurityManagerChannel Loading Loading @@ -79,10 +95,27 @@ class SecurityManagerChannel { */ void OnCommandComplete(hci::CommandCompleteView packet); protected: SecurityManagerChannel(os::Handler* handler, hci::HciLayer* hci_layer); virtual void OnRegistrationComplete(l2cap::classic::FixedChannelManager::RegistrationResult result, std::unique_ptr<l2cap::classic::FixedChannelService> fixed_channel_service); virtual void OnUnregistered(); virtual void OnConnectionOpen(std::unique_ptr<l2cap::classic::FixedChannel> fixed_channel); virtual void OnConnectionFail(hci::Address address, l2cap::classic::FixedChannelManager::ConnectionResult result); virtual void OnConnectionClose(hci::Address address, hci::ErrorCode error_code); bool is_test_mode_ = false; private: ISecurityManagerChannelListener* listener_; hci::SecurityInterface* hci_security_interface_; os::Handler* handler_; ISecurityManagerChannelListener* listener_{nullptr}; hci::SecurityInterface* hci_security_interface_{nullptr}; os::Handler* handler_{nullptr}; l2cap::SecurityPolicy security_policy_; std::unique_ptr<l2cap::classic::FixedChannelManager> fixed_channel_manager_{nullptr}; std::unique_ptr<l2cap::classic::FixedChannelService> fixed_channel_service_{nullptr}; std::unordered_map<hci::Address, std::unique_ptr<l2cap::classic::FixedChannel>> fixed_channel_map_; }; } // namespace channel Loading
system/gd/security/channel/security_manager_channel_unittest.cc +22 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <gtest/gtest.h> #include "hci/hci_packets.h" #include "l2cap/classic/fixed_channel.h" #include "packet/raw_builder.h" #include "security/smp_packets.h" #include "security/test/fake_hci_layer.h" Loading @@ -41,6 +42,17 @@ using os::Handler; using os::Thread; using packet::RawBuilder; class FakeSecurityManagerChannel : public SecurityManagerChannel { public: FakeSecurityManagerChannel(os::Handler* handler, hci::HciLayer* hci_layer) : SecurityManagerChannel(handler, hci_layer) {} ~FakeSecurityManagerChannel() {} void OnConnectionOpen(std::unique_ptr<l2cap::classic::FixedChannel> fixed_channel) override { LOG_ERROR("CALLED"); } }; class SecurityManagerChannelCallback : public ISecurityManagerChannelListener { public: // HCI Loading Loading @@ -184,6 +196,15 @@ class SecurityManagerChannelCallback : public ISecurityManagerChannelListener { break; } } void OnConnectionClosed(hci::Address address, bluetooth::hci::ErrorCode error_code) override { LOG_DEBUG("Called"); } void OnConnectionFailed(hci::Address address, bluetooth::l2cap::classic::FixedChannelManager::ConnectionResult result) override { LOG_DEBUG("Shouldn't be called"); } }; class SecurityManagerChannelTest : public ::testing::Test { Loading @@ -194,7 +215,7 @@ class SecurityManagerChannelTest : public ::testing::Test { hci_layer_ = new FakeHciLayer(); fake_registry_.InjectTestModule(&FakeHciLayer::Factory, hci_layer_); fake_registry_.Start<FakeHciLayer>(&thread_); channel_ = new SecurityManagerChannel(handler_, hci_layer_); channel_ = new FakeSecurityManagerChannel(handler_, hci_layer_); channel_->SetChannelListener(callback_); } Loading
system/gd/security/internal/security_manager_impl.cc +25 −4 Original line number Diff line number Diff line Loading @@ -48,8 +48,8 @@ void SecurityManagerImpl::DispatchPairingHandler(record::SecurityRecord& record, std::shared_ptr<record::SecurityRecord> record_copy = std::make_shared<record::SecurityRecord>(record.GetPseudoAddress()); pairing_handler = std::make_shared<security::pairing::ClassicPairingHandler>( l2cap_classic_module_->GetFixedChannelManager(), security_manager_channel_, record_copy, security_handler_, std::move(callback), user_interface_, user_interface_handler_, "TODO: grab device name properly"); security_manager_channel_, record_copy, security_handler_, std::move(callback), user_interface_, user_interface_handler_, "TODO: grab device name properly"); break; } default: Loading Loading @@ -247,6 +247,26 @@ void SecurityManagerImpl::OnHciEventReceived(hci::EventPacketView packet) { } } void SecurityManagerImpl::OnConnectionClosed(hci::Address address, bluetooth::hci::ErrorCode error_code) { LOG_DEBUG("Reason: %s ", hci::ErrorCodeText(error_code).c_str()); auto entry = pairing_handler_map_.find(address); if (entry != pairing_handler_map_.end()) { LOG_DEBUG("Cancelling pairing handler for '%s'", address.ToString().c_str()); entry->second->Cancel(); } } void SecurityManagerImpl::OnConnectionFailed(hci::Address address, bluetooth::l2cap::classic::FixedChannelManager::ConnectionResult result) { LOG_DEBUG("HCI Reason: %s ", hci::ErrorCodeText(result.hci_error).c_str()); LOG_DEBUG("L2CAP Reason: %d ", result.connection_result_code); auto entry = pairing_handler_map_.find(address); if (entry != pairing_handler_map_.end()) { LOG_DEBUG("Cancelling pairing handler for '%s'", address.ToString().c_str()); entry->second->Cancel(); } } void SecurityManagerImpl::OnHciLeEvent(hci::LeMetaEventView event) { // hci::SubeventCode::LONG_TERM_KEY_REQUEST, // hci::SubeventCode::READ_LOCAL_P256_PUBLIC_KEY_COMPLETE, Loading Loading @@ -289,6 +309,7 @@ void SecurityManagerImpl::OnPairingHandlerComplete(hci::Address address, Pairing auto entry = pairing_handler_map_.find(address); if (entry != pairing_handler_map_.end()) { pairing_handler_map_.erase(entry); security_manager_channel_->Disconnect(address); } if (!std::holds_alternative<PairingFailure>(status)) { NotifyDeviceBonded(hci::AddressWithType(address, hci::AddressType::PUBLIC_DEVICE_ADDRESS)); Loading Loading @@ -382,15 +403,15 @@ void SecurityManagerImpl::OnConnectionFailureLe(bluetooth::l2cap::le::FixedChann } SecurityManagerImpl::SecurityManagerImpl(os::Handler* security_handler, l2cap::le::L2capLeModule* l2cap_le_module, l2cap::classic::L2capClassicModule* l2cap_classic_module, channel::SecurityManagerChannel* security_manager_channel, hci::HciLayer* hci_layer) : security_handler_(security_handler), l2cap_le_module_(l2cap_le_module), l2cap_classic_module_(l2cap_classic_module), l2cap_manager_le_(l2cap_le_module_->GetFixedChannelManager()), l2cap_manager_le_(l2cap_le_module_->GetFixedChannelManager()), hci_security_interface_le_(hci_layer->GetLeSecurityInterface( common::Bind(&SecurityManagerImpl::OnHciLeEvent, common::Unretained(this)), security_handler)), security_manager_channel_(security_manager_channel) { Init(); l2cap_manager_le_->RegisterService( bluetooth::l2cap::kSmpCid, {}, common::BindOnce(&SecurityManagerImpl::OnL2capRegistrationCompleteLe, common::Unretained(this)), Loading