Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5466b233 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "SM: Implement and use facade configuration API"

parents bb1bd541 3b595a31
Loading
Loading
Loading
Loading
+8 −62
Original line number Diff line number Diff line
@@ -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;
  }

+2 −2
Original line number Diff line number Diff line
@@ -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) {}
@@ -63,7 +63,7 @@ enum IoCapabilities {
  NO_INPUT_NO_OUTPUT = 3;
}

message IoCapabilitiesMessage {
message IoCapabilityMessage {
  IoCapabilities capability = 1;
}

+2 −2
Original line number Diff line number Diff line
@@ -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));
}

+1 −1
Original line number Diff line number Diff line
@@ -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);

+18 −7
Original line number Diff line number Diff line
@@ -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());
@@ -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() {
@@ -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);
  }
}

@@ -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);
@@ -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