Loading system/gd/security/facade.cc +8 −62 Original line number Diff line number Diff line Loading @@ -92,79 +92,25 @@ class SecurityModuleFacadeService : public SecurityModuleFacade::Service, public return bond_events_.RunLoop(context, writer); } ::grpc::Status SetIoCapabilities(::grpc::ServerContext* context, const IoCapabilitiesMessage* request, ::grpc::Status SetIoCapability(::grpc::ServerContext* context, const IoCapabilityMessage* request, ::google::protobuf::Empty* response) override { hci::IoCapability io_capability = hci::IoCapability::NO_INPUT_NO_OUTPUT; switch (request->capability()) { case IoCapabilities::DISPLAY_ONLY: io_capability = hci::IoCapability::DISPLAY_ONLY; break; case IoCapabilities::DISPLAY_YES_NO_IO_CAP: io_capability = hci::IoCapability::DISPLAY_YES_NO; break; case IoCapabilities::KEYBOARD_ONLY: io_capability = hci::IoCapability::KEYBOARD_ONLY; break; case IoCapabilities::NO_INPUT_NO_OUTPUT: io_capability = hci::IoCapability::NO_INPUT_NO_OUTPUT; break; default: LOG_ERROR("Unknown IoCapability %d", static_cast<int>(request->capability())); } security_module_->GetFacadeConfigurationApi()->SetIoCapabilities(io_capability); security_module_->GetFacadeConfigurationApi()->SetIoCapability( static_cast<hci::IoCapability>(request->capability())); return ::grpc::Status::OK; } ::grpc::Status SetAuthenticationRequirements(::grpc::ServerContext* context, const AuthenticationRequirementsMessage* request, ::google::protobuf::Empty* response) override { hci::AuthenticationRequirements authentication_requirements = hci::AuthenticationRequirements::NO_BONDING; switch (request->requirement()) { case AuthenticationRequirements::NO_BONDING: authentication_requirements = hci::AuthenticationRequirements::NO_BONDING; break; case AuthenticationRequirements::NO_BONDING_MITM_PROTECTION: authentication_requirements = hci::AuthenticationRequirements::NO_BONDING_MITM_PROTECTION; break; case AuthenticationRequirements::DEDICATED_BONDING: authentication_requirements = hci::AuthenticationRequirements::DEDICATED_BONDING; break; case AuthenticationRequirements::DEDICATED_BONDING_MITM_PROTECTION: authentication_requirements = hci::AuthenticationRequirements::DEDICATED_BONDING_MITM_PROTECTION; break; case AuthenticationRequirements::GENERAL_BONDING: authentication_requirements = hci::AuthenticationRequirements::GENERAL_BONDING; break; case AuthenticationRequirements::GENERAL_BONDING_MITM_PROTECTION: authentication_requirements = hci::AuthenticationRequirements::GENERAL_BONDING_MITM_PROTECTION; break; default: LOG_ERROR("Unknown Authentication Requirements %d", static_cast<int>(request->requirement())); } security_module_->GetFacadeConfigurationApi()->SetAuthenticationRequirements(authentication_requirements); security_module_->GetFacadeConfigurationApi()->SetAuthenticationRequirements( static_cast<hci::AuthenticationRequirements>(request->requirement())); return ::grpc::Status::OK; } ::grpc::Status SetOobDataPresent(::grpc::ServerContext* context, const OobDataMessage* request, ::google::protobuf::Empty* response) override { hci::OobDataPresent data_present = hci::OobDataPresent::NOT_PRESENT; switch (request->data_present()) { case OobDataPresent::NOT_PRESENT: data_present = hci::OobDataPresent::NOT_PRESENT; break; case OobDataPresent::P192_PRESENT: data_present = hci::OobDataPresent::P_192_PRESENT; break; case OobDataPresent::P256_PRESENT: data_present = hci::OobDataPresent::P_256_PRESENT; break; case OobDataPresent::P192_AND_256_PRESENT: data_present = hci::OobDataPresent::P_192_AND_256_PRESENT; break; default: LOG_ERROR("Unknown oob data present %d", static_cast<int>(data_present())); } security_module_->GetFacadeConfigurationApi()->SetOobData(data_present); security_module_->GetFacadeConfigurationApi()->SetOobData( static_cast<hci::OobDataPresent>(request->data_present())); return ::grpc::Status::OK; } Loading system/gd/security/facade.proto +2 −2 Original line number Diff line number Diff line Loading @@ -9,7 +9,7 @@ service SecurityModuleFacade { rpc CreateBond(facade.BluetoothAddressWithType) returns (google.protobuf.Empty) {} rpc CancelBond(facade.BluetoothAddressWithType) returns (google.protobuf.Empty) {} rpc RemoveBond(facade.BluetoothAddressWithType) returns (google.protobuf.Empty) {} rpc SetIoCapabilities(IoCapabilitiesMessage) returns (google.protobuf.Empty) {} rpc SetIoCapability(IoCapabilityMessage) returns (google.protobuf.Empty) {} rpc SetAuthenticationRequirements(AuthenticationRequirementsMessage) returns (google.protobuf.Empty) {} rpc SetOobDataPresent(OobDataMessage) returns (google.protobuf.Empty) {} rpc SendUiCallback(UiCallbackMsg) returns (google.protobuf.Empty) {} Loading Loading @@ -63,7 +63,7 @@ enum IoCapabilities { NO_INPUT_NO_OUTPUT = 3; } message IoCapabilitiesMessage { message IoCapabilityMessage { IoCapabilities capability = 1; } Loading system/gd/security/facade_configuration_api.cc +2 −2 Original line number Diff line number Diff line Loading @@ -22,8 +22,8 @@ namespace bluetooth { namespace security { void FacadeConfigurationApi::SetIoCapabilities(hci::IoCapability io_capability) { security_handler_->Post(common::BindOnce(&internal::SecurityManagerImpl::SetIoCapabilities, void FacadeConfigurationApi::SetIoCapability(hci::IoCapability io_capability) { security_handler_->Post(common::BindOnce(&internal::SecurityManagerImpl::SetIoCapability, common::Unretained(security_manager_impl_), io_capability)); } Loading system/gd/security/facade_configuration_api.h +1 −1 Original line number Diff line number Diff line Loading @@ -37,7 +37,7 @@ class FacadeConfigurationApi { friend class internal::SecurityManagerImpl; friend class SecurityModule; void SetIoCapabilities(hci::IoCapability io_capability); void SetIoCapability(hci::IoCapability io_capability); void SetAuthenticationRequirements(hci::AuthenticationRequirements authentication_requirement); void SetOobData(hci::OobDataPresent oob_present); Loading system/gd/security/internal/security_manager_impl.cc +18 −7 Original line number Diff line number Diff line Loading @@ -33,8 +33,7 @@ namespace bluetooth { namespace security { namespace internal { void SecurityManagerImpl::DispatchPairingHandler(record::SecurityRecord& record, bool locally_initiated, hci::AuthenticationRequirements authentication_requirements) { void SecurityManagerImpl::DispatchPairingHandler(record::SecurityRecord& record, bool locally_initiated) { common::OnceCallback<void(hci::Address, PairingResultOrFailure)> callback = common::BindOnce(&SecurityManagerImpl::OnPairingHandlerComplete, common::Unretained(this)); auto entry = pairing_handler_map_.find(record.GetPseudoAddress().GetAddress()); Loading @@ -58,8 +57,8 @@ void SecurityManagerImpl::DispatchPairingHandler(record::SecurityRecord& record, auto new_entry = std::pair<hci::Address, std::shared_ptr<pairing::PairingHandler>>( record.GetPseudoAddress().GetAddress(), pairing_handler); pairing_handler_map_.insert(std::move(new_entry)); pairing_handler->Initiate(locally_initiated, pairing::kDefaultIoCapability, pairing::kDefaultOobDataPresent, authentication_requirements); pairing_handler->Initiate(locally_initiated, this->local_io_capability_, this->local_oob_data_present_, this->local_authentication_requirements_); } void SecurityManagerImpl::Init() { Loading @@ -75,7 +74,7 @@ void SecurityManagerImpl::CreateBond(hci::AddressWithType device) { NotifyDeviceBonded(device); } else { // Dispatch pairing handler, if we are calling create we are the initiator DispatchPairingHandler(record, true, pairing::kDefaultAuthenticationRequirements); DispatchPairingHandler(record, true); } } Loading Loading @@ -183,8 +182,7 @@ void SecurityManagerImpl::HandleEvent(T packet) { auto record = security_database_.FindOrCreate(hci::AddressWithType{bd_addr, hci::AddressType::PUBLIC_DEVICE_ADDRESS}); auto authentication_requirements = hci::AuthenticationRequirements::NO_BONDING; DispatchPairingHandler(record, true, authentication_requirements); DispatchPairingHandler(record, true); entry = pairing_handler_map_.find(bd_addr); } entry->second->OnReceive(packet); Loading Loading @@ -437,6 +435,19 @@ void SecurityManagerImpl::OnPairingFinished(security::PairingResultOrFailure pai std::get<PairingResult>(pairing_result).connection_address.ToString().c_str()); } // Facade Configuration API functions void SecurityManagerImpl::SetIoCapability(hci::IoCapability io_capability) { this->local_io_capability_ = io_capability; } void SecurityManagerImpl::SetAuthenticationRequirements(hci::AuthenticationRequirements authentication_requirements) { this->local_authentication_requirements_ = authentication_requirements; } void SecurityManagerImpl::SetOobDataPresent(hci::OobDataPresent data_present) { this->local_oob_data_present_ = data_present; } } // namespace internal } // namespace security } // namespace bluetooth Loading
system/gd/security/facade.cc +8 −62 Original line number Diff line number Diff line Loading @@ -92,79 +92,25 @@ class SecurityModuleFacadeService : public SecurityModuleFacade::Service, public return bond_events_.RunLoop(context, writer); } ::grpc::Status SetIoCapabilities(::grpc::ServerContext* context, const IoCapabilitiesMessage* request, ::grpc::Status SetIoCapability(::grpc::ServerContext* context, const IoCapabilityMessage* request, ::google::protobuf::Empty* response) override { hci::IoCapability io_capability = hci::IoCapability::NO_INPUT_NO_OUTPUT; switch (request->capability()) { case IoCapabilities::DISPLAY_ONLY: io_capability = hci::IoCapability::DISPLAY_ONLY; break; case IoCapabilities::DISPLAY_YES_NO_IO_CAP: io_capability = hci::IoCapability::DISPLAY_YES_NO; break; case IoCapabilities::KEYBOARD_ONLY: io_capability = hci::IoCapability::KEYBOARD_ONLY; break; case IoCapabilities::NO_INPUT_NO_OUTPUT: io_capability = hci::IoCapability::NO_INPUT_NO_OUTPUT; break; default: LOG_ERROR("Unknown IoCapability %d", static_cast<int>(request->capability())); } security_module_->GetFacadeConfigurationApi()->SetIoCapabilities(io_capability); security_module_->GetFacadeConfigurationApi()->SetIoCapability( static_cast<hci::IoCapability>(request->capability())); return ::grpc::Status::OK; } ::grpc::Status SetAuthenticationRequirements(::grpc::ServerContext* context, const AuthenticationRequirementsMessage* request, ::google::protobuf::Empty* response) override { hci::AuthenticationRequirements authentication_requirements = hci::AuthenticationRequirements::NO_BONDING; switch (request->requirement()) { case AuthenticationRequirements::NO_BONDING: authentication_requirements = hci::AuthenticationRequirements::NO_BONDING; break; case AuthenticationRequirements::NO_BONDING_MITM_PROTECTION: authentication_requirements = hci::AuthenticationRequirements::NO_BONDING_MITM_PROTECTION; break; case AuthenticationRequirements::DEDICATED_BONDING: authentication_requirements = hci::AuthenticationRequirements::DEDICATED_BONDING; break; case AuthenticationRequirements::DEDICATED_BONDING_MITM_PROTECTION: authentication_requirements = hci::AuthenticationRequirements::DEDICATED_BONDING_MITM_PROTECTION; break; case AuthenticationRequirements::GENERAL_BONDING: authentication_requirements = hci::AuthenticationRequirements::GENERAL_BONDING; break; case AuthenticationRequirements::GENERAL_BONDING_MITM_PROTECTION: authentication_requirements = hci::AuthenticationRequirements::GENERAL_BONDING_MITM_PROTECTION; break; default: LOG_ERROR("Unknown Authentication Requirements %d", static_cast<int>(request->requirement())); } security_module_->GetFacadeConfigurationApi()->SetAuthenticationRequirements(authentication_requirements); security_module_->GetFacadeConfigurationApi()->SetAuthenticationRequirements( static_cast<hci::AuthenticationRequirements>(request->requirement())); return ::grpc::Status::OK; } ::grpc::Status SetOobDataPresent(::grpc::ServerContext* context, const OobDataMessage* request, ::google::protobuf::Empty* response) override { hci::OobDataPresent data_present = hci::OobDataPresent::NOT_PRESENT; switch (request->data_present()) { case OobDataPresent::NOT_PRESENT: data_present = hci::OobDataPresent::NOT_PRESENT; break; case OobDataPresent::P192_PRESENT: data_present = hci::OobDataPresent::P_192_PRESENT; break; case OobDataPresent::P256_PRESENT: data_present = hci::OobDataPresent::P_256_PRESENT; break; case OobDataPresent::P192_AND_256_PRESENT: data_present = hci::OobDataPresent::P_192_AND_256_PRESENT; break; default: LOG_ERROR("Unknown oob data present %d", static_cast<int>(data_present())); } security_module_->GetFacadeConfigurationApi()->SetOobData(data_present); security_module_->GetFacadeConfigurationApi()->SetOobData( static_cast<hci::OobDataPresent>(request->data_present())); return ::grpc::Status::OK; } Loading
system/gd/security/facade.proto +2 −2 Original line number Diff line number Diff line Loading @@ -9,7 +9,7 @@ service SecurityModuleFacade { rpc CreateBond(facade.BluetoothAddressWithType) returns (google.protobuf.Empty) {} rpc CancelBond(facade.BluetoothAddressWithType) returns (google.protobuf.Empty) {} rpc RemoveBond(facade.BluetoothAddressWithType) returns (google.protobuf.Empty) {} rpc SetIoCapabilities(IoCapabilitiesMessage) returns (google.protobuf.Empty) {} rpc SetIoCapability(IoCapabilityMessage) returns (google.protobuf.Empty) {} rpc SetAuthenticationRequirements(AuthenticationRequirementsMessage) returns (google.protobuf.Empty) {} rpc SetOobDataPresent(OobDataMessage) returns (google.protobuf.Empty) {} rpc SendUiCallback(UiCallbackMsg) returns (google.protobuf.Empty) {} Loading Loading @@ -63,7 +63,7 @@ enum IoCapabilities { NO_INPUT_NO_OUTPUT = 3; } message IoCapabilitiesMessage { message IoCapabilityMessage { IoCapabilities capability = 1; } Loading
system/gd/security/facade_configuration_api.cc +2 −2 Original line number Diff line number Diff line Loading @@ -22,8 +22,8 @@ namespace bluetooth { namespace security { void FacadeConfigurationApi::SetIoCapabilities(hci::IoCapability io_capability) { security_handler_->Post(common::BindOnce(&internal::SecurityManagerImpl::SetIoCapabilities, void FacadeConfigurationApi::SetIoCapability(hci::IoCapability io_capability) { security_handler_->Post(common::BindOnce(&internal::SecurityManagerImpl::SetIoCapability, common::Unretained(security_manager_impl_), io_capability)); } Loading
system/gd/security/facade_configuration_api.h +1 −1 Original line number Diff line number Diff line Loading @@ -37,7 +37,7 @@ class FacadeConfigurationApi { friend class internal::SecurityManagerImpl; friend class SecurityModule; void SetIoCapabilities(hci::IoCapability io_capability); void SetIoCapability(hci::IoCapability io_capability); void SetAuthenticationRequirements(hci::AuthenticationRequirements authentication_requirement); void SetOobData(hci::OobDataPresent oob_present); Loading
system/gd/security/internal/security_manager_impl.cc +18 −7 Original line number Diff line number Diff line Loading @@ -33,8 +33,7 @@ namespace bluetooth { namespace security { namespace internal { void SecurityManagerImpl::DispatchPairingHandler(record::SecurityRecord& record, bool locally_initiated, hci::AuthenticationRequirements authentication_requirements) { void SecurityManagerImpl::DispatchPairingHandler(record::SecurityRecord& record, bool locally_initiated) { common::OnceCallback<void(hci::Address, PairingResultOrFailure)> callback = common::BindOnce(&SecurityManagerImpl::OnPairingHandlerComplete, common::Unretained(this)); auto entry = pairing_handler_map_.find(record.GetPseudoAddress().GetAddress()); Loading @@ -58,8 +57,8 @@ void SecurityManagerImpl::DispatchPairingHandler(record::SecurityRecord& record, auto new_entry = std::pair<hci::Address, std::shared_ptr<pairing::PairingHandler>>( record.GetPseudoAddress().GetAddress(), pairing_handler); pairing_handler_map_.insert(std::move(new_entry)); pairing_handler->Initiate(locally_initiated, pairing::kDefaultIoCapability, pairing::kDefaultOobDataPresent, authentication_requirements); pairing_handler->Initiate(locally_initiated, this->local_io_capability_, this->local_oob_data_present_, this->local_authentication_requirements_); } void SecurityManagerImpl::Init() { Loading @@ -75,7 +74,7 @@ void SecurityManagerImpl::CreateBond(hci::AddressWithType device) { NotifyDeviceBonded(device); } else { // Dispatch pairing handler, if we are calling create we are the initiator DispatchPairingHandler(record, true, pairing::kDefaultAuthenticationRequirements); DispatchPairingHandler(record, true); } } Loading Loading @@ -183,8 +182,7 @@ void SecurityManagerImpl::HandleEvent(T packet) { auto record = security_database_.FindOrCreate(hci::AddressWithType{bd_addr, hci::AddressType::PUBLIC_DEVICE_ADDRESS}); auto authentication_requirements = hci::AuthenticationRequirements::NO_BONDING; DispatchPairingHandler(record, true, authentication_requirements); DispatchPairingHandler(record, true); entry = pairing_handler_map_.find(bd_addr); } entry->second->OnReceive(packet); Loading Loading @@ -437,6 +435,19 @@ void SecurityManagerImpl::OnPairingFinished(security::PairingResultOrFailure pai std::get<PairingResult>(pairing_result).connection_address.ToString().c_str()); } // Facade Configuration API functions void SecurityManagerImpl::SetIoCapability(hci::IoCapability io_capability) { this->local_io_capability_ = io_capability; } void SecurityManagerImpl::SetAuthenticationRequirements(hci::AuthenticationRequirements authentication_requirements) { this->local_authentication_requirements_ = authentication_requirements; } void SecurityManagerImpl::SetOobDataPresent(hci::OobDataPresent data_present) { this->local_oob_data_present_ = data_present; } } // namespace internal } // namespace security } // namespace bluetooth