| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_SM_SECURITY_REQUEST_PHASE_H_ |
| #define SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_SM_SECURITY_REQUEST_PHASE_H_ |
| |
| #include <lib/fit/function.h> |
| |
| #include <string> |
| |
| #include "src/connectivity/bluetooth/core/bt-host/sm/pairing_channel.h" |
| #include "src/connectivity/bluetooth/core/bt-host/sm/pairing_phase.h" |
| #include "src/connectivity/bluetooth/core/bt-host/sm/smp.h" |
| #include "src/connectivity/bluetooth/core/bt-host/sm/types.h" |
| #include "src/connectivity/bluetooth/lib/cpp-string/string_printf.h" |
| #include "src/lib/fxl/memory/weak_ptr.h" |
| |
| namespace bt::sm { |
| |
| // SecurityRequestPhase is responsible for sending outbound Security Requests and handling the |
| // peer's response. As Security Requests can only be sent from an SMP responder, this class should |
| // only be instantiated when acting as the SMP responder. |
| // |
| // This class is not thread safe and is meant to be accessed on the thread it was created on. All |
| // callbacks will be run by the default dispatcher of an SecurityRequestPhase's creation thread. |
| |
| class SecurityRequestPhase final : public PairingPhase, public PairingChannelHandler { |
| public: |
| // Initializes this SecurityRequestPhase with the following parameters: |
| // - |chan|, |listener|: To construct the base PairingPhase |
| // - |desired_level|: The level of security requested by the SM client to cause this Security |
| // Request. |
| // - |bondable_mode|: The operating bondable mode of the device (v5.2 Vol. 3 Part C 9.4). |
| // - |on_pairing_req|: Used to signal the owning class of an inbound Pairing Request triggered |
| // by this Security Request. |
| SecurityRequestPhase(fxl::WeakPtr<PairingChannel> chan, fxl::WeakPtr<Listener> listener, |
| SecurityLevel desired_level, BondableMode bondable_mode, |
| PairingRequestCallback on_pairing_req); |
| |
| ~SecurityRequestPhase() override = default; |
| |
| // PairingPhase override. |
| void Start() final; |
| |
| SecurityLevel pending_security_request() const { return pending_security_request_; } |
| |
| private: |
| // Makes a Security Request to the peer per V5.0 Vol. 3 Part H 2.4.6. Providing |
| // SecurityLevel::kNoSecurity as |desired_level| is a client error and will assert. |
| void MakeSecurityRequest(SecurityLevel desired_level, BondableMode bondable_mode); |
| |
| // Handle pairing requests from the peer. |
| void OnPairingRequest(PairingRequestParams req_params); |
| |
| // PairingChannelHandler overrides: |
| void OnRxBFrame(ByteBufferPtr sdu) override; |
| void OnChannelClosed() override { PairingPhase::HandleChannelClosed(); } |
| |
| // PairingPhase overrides |
| fxl::WeakPtr<PairingChannelHandler> AsChannelHandler() override { |
| return weak_ptr_factory_.GetWeakPtr(); |
| } |
| std::string ToStringInternal() override { |
| return bt_lib_cpp_string::StringPrintf( |
| "Security Request Phase - pending security request for %s", |
| LevelToString(pending_security_request_)); |
| } |
| |
| BondableMode bondable_mode_; |
| SecurityLevel pending_security_request_; |
| |
| PairingRequestCallback on_pairing_req_; |
| fxl::WeakPtrFactory<SecurityRequestPhase> weak_ptr_factory_; |
| DISALLOW_COPY_AND_ASSIGN_ALLOW_MOVE(SecurityRequestPhase); |
| }; |
| |
| } // namespace bt::sm |
| |
| #endif // SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_SM_SECURITY_REQUEST_PHASE_H_ |