| // Copyright 2022 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. |
| library fuchsia.bluetooth.sys; |
| |
| using fuchsia.bluetooth as bt; |
| |
| /// Allows system clients to enable Bluetooth pairing. |
| @available(added=HEAD) |
| @discoverable |
| closed protocol Pairing { |
| /// Assign a PairingDelegate to respond to pairing procedures. The provided I/O capabilities |
| /// will be used to determine the pairing methods used. |
| /// |
| /// Only one PairingDelegate can be set at a time system-wide - if this is called |
| /// while another delegate is set, the new delegate will be closed immediately. |
| /// Closing a PairingDelegate after it is set aborts all ongoing pairing procedures |
| /// without accepting and unsets the delegate. |
| /// |
| /// If no PairingDelegate is set, all pairings will be rejected even if the |
| /// peer connection was initiated by the local device. |
| /// |
| /// + request `input` Bluetooth input capability, see `InputCapability` |
| /// + request `output` Bluetooth output capability, see `OutputCapability` |
| /// + request `delegate` PairingDelegate which will receive pairing requests |
| strict SetPairingDelegate(resource struct { |
| input InputCapability; |
| output OutputCapability; |
| delegate client_end:PairingDelegate; |
| }); |
| |
| /// Assign a PairingDelegate2 to handle pairing procedures. The provided |
| /// I/O capabilities will be used to determine the methods used. |
| /// |
| /// Only one of PairingDelegate or PairingDelegate2 can be set at a time |
| /// system-wide. If this is called while another delegate is set, the new |
| /// delegate will be closed immediately. |
| /// |
| /// Closing a PairingDelegate2 unsets the pairing delegate. Ongoing |
| /// PairingRequests can still be completed, but new requests will act as if |
| /// no delegate is set. |
| /// |
| /// If no delegate is set, all pairings will be rejected even if the |
| /// peer connection was initiated by the local device. |
| /// |
| /// + request `input` Bluetooth input capability, see `InputCapability` |
| /// + request `output` Bluetooth output capability, see `OutputCapability` |
| /// + request `delegate` PairingDelegate2 which will receive pairing requests |
| strict SetDelegate(resource struct { |
| input InputCapability; |
| output OutputCapability; |
| delegate client_end:PairingDelegate2; |
| }); |
| }; |
| |
| /// Input Capabilities for pairing exchanges. |
| /// These should be set based on the ability of the local system to enter |
| /// responses to pairing requests. |
| /// See Volume 3, Part C, Table 5.3 for more information. |
| type InputCapability = strict enum { |
| /// There is no user input method available for responding 'yes' or 'no' to |
| /// a pairing request. |
| /// Note: setting this setting will mean most pairings are considered |
| /// unauthenticated and vulnerable to machine-in-the-middle attacks. |
| NONE = 1; |
| /// The user can respond yes or no to a request. |
| CONFIRMATION = 2; |
| /// The user has a keyboard (or other UI) where they can type a numerical code |
| /// and signal they have finished or cancel. |
| KEYBOARD = 3; |
| }; |
| |
| /// Output Capabilities for pairing excanges. |
| /// These should be set based on the ability of the local system to display |
| /// information to the user initiating or accepting a Bluetooth pairing. |
| /// See Volume 3, Part C, Table 5.4 for more information. |
| type OutputCapability = strict enum { |
| /// There is no display available for pairing. |
| NONE = 1; |
| /// There is a display that can show at least a six-digit decimal number. |
| DISPLAY = 2; |
| }; |
| |
| /// Different types required by the Security Manager for pairing methods. |
| /// Bluetooth SIG has different requirements for different device capabilities. |
| type PairingMethod = strict enum { |
| /// The user is asked to accept or reject pairing. |
| /// This is the minimum method - even when both devices do not support |
| /// input or output, the delegate will be asked to confirm any pairing |
| /// not initiated with user intent. |
| CONSENT = 1; |
| |
| /// The user is shown a 6-digit numerical passkey on this device which they |
| /// must enter on the peer device. |
| PASSKEY_DISPLAY = 2; |
| |
| /// The user is shown a 6-digit numerical passkey on this device which will |
| /// also shown on the peer device. The user must compare the passkeys and |
| /// accept the pairing if the passkeys match. |
| PASSKEY_COMPARISON = 3; |
| |
| /// The user is asked to enter a 6-digit passkey on this device which is |
| /// communicated via the peer device. |
| PASSKEY_ENTRY = 4; |
| }; |
| |
| |
| /// Used to convey information to the peer on progress typing a passkey. The |
| /// various types of keypresses can be used to customize what is communicated to |
| /// the user requesting a pairing. |
| type PairingKeypress = strict enum { |
| /// The user has entered a single digit. |
| DIGIT_ENTERED = 1; |
| |
| /// The user has erased a single digit. |
| DIGIT_ERASED = 2; |
| |
| /// The user has cleared the entire passkey. |
| PASSKEY_CLEARED = 3; |
| |
| /// The user has finished entering the passkey. |
| PASSKEY_ENTERED = 4; |
| }; |
| |
| /// A Bluetooth Pairing Delegate is responsible for confirming or denying |
| /// pairing requests received from Bluetooth peers that connect or are |
| /// being connected to the local device. |
| /// |
| /// Any new pairing will result in a call to `PairingDelegate.OnPairingRequest`, |
| /// including pairings where the InputCapability and OutputCapability are set |
| /// to none. The delegate is expected to have enough context to derive whether |
| /// to accept or deny the pairing. |
| /// |
| /// Only one delegate is allowed to be set per system at a time. See |
| /// `fuchsia.bluetooth.sys.Pairing` for how to set the pairing delegate. |
| closed protocol PairingDelegate { |
| /// Called to confirm a pairing. The pairing process will be continued if |
| /// `accept` response is true and rejected otherwise. |
| /// If the pairing method requires a passkey it must be included as well. |
| /// Pairing methods that do not require a passkey ignore the `entered_passkey` |
| /// repsonse. |
| /// |
| /// The pairing can fail (usually by timeout or peer disconnect) before the |
| /// response is received. The OnPairingComplete method will be called when this |
| /// occurs. Any response sent in this case will be ignored. |
| /// |
| /// + request `peer` information about the peer being paired |
| /// + request `method` method of pairing active. See `PairingMethod` |
| /// + request `displayed_passkey` a passkey to display to the user if |
| /// PASSKEY_DISPLAY or PASSKEY_COMPARISON is being used. Meaningless |
| /// otherwise. |
| /// - response `accept` true if the pairing is accepted |
| /// - response `entered_passkey` passkey entered by the user. Ignored unless |
| /// method is PASSKEY_ENTRY. |
| strict OnPairingRequest(struct { |
| peer Peer; |
| method PairingMethod; |
| displayed_passkey uint32; |
| }) -> (struct { |
| accept bool; |
| entered_passkey uint32; |
| }); |
| |
| /// Called when the pairing procedure for a peer has been completed. |
| /// This can be due to successful completion or an error (e.g. due to cancellation |
| /// by the peer, a timeout, or disconnection). |
| /// * request `id` The Bluetooth peer ID of the peer which was being paired. |
| /// * request `success` true if the pairing succeeded, otherwise false. |
| strict OnPairingComplete(struct { |
| id bt.PeerId; |
| success bool; |
| }); |
| |
| /// Called to notify keypresses from the peer device during pairing using |
| /// `PairingMethod.PASSKEY_DISPLAY`. |
| /// |
| /// This event is used to provide key press events to the delegate for a responsive user |
| /// experience as the user types the passkey on the peer device. This event will be called |
| /// once for each keypress. |
| /// |
| /// This event will only be called between when an OnPairingRequest has been sent for |
| /// `id` and when OnPairingComplete is sent. |
| /// |
| /// Note: many devices do not send these events |
| /// * request `id` The peer id of the peer that sent the keypress event. |
| /// * request `keypress` The type of event which was received. |
| strict OnRemoteKeypress(struct { |
| id bt.PeerId; |
| keypress PairingKeypress; |
| }); |
| |
| /// The delegate can send this event to notify the peer of local keypresses |
| /// during pairing using `PairingMethod.PASSKEY_ENTRY`. |
| /// |
| /// Sending local keypress events can allow the user additional time for |
| /// pairing when entering a passkey. |
| /// |
| /// This should only be sent after an OnPairingRequest has been received |
| /// with a PASSKEY_ENTRY method, and before the reponse for that pairing |
| /// request. |
| /// |
| /// * request `id` id of a peer with a pairing request active |
| /// * request `keypress` the type of notification which should be sent |
| strict -> OnLocalKeypress(struct { |
| id bt.PeerId; |
| keypress PairingKeypress; |
| }); |
| }; |
| |
| @available(added=HEAD) |
| type PairingProperties = flexible union { |
| /// The user is asked to accept or reject pairing. |
| /// This is the minimum method - even when both devices do not support |
| /// input or output, the delegate will be asked to confirm any pairing |
| /// not initiated with user intent. |
| 1: consent struct {}; |
| /// The user is shown a 6-digit numerical passkey on this device which they |
| /// must key in on the peer device. |
| /// The passkey to be displayed is provided. |
| 2: passkey_display uint32; |
| /// The user is shown a 6-digit numerical passkey on this device which will |
| /// also be shown on the peer device. The user must compare the passkeys and |
| /// accept the pairing if the passkeys match. |
| /// The passkey to be displayed is provided. |
| 3: passkey_confirmation uint32; |
| /// The user is asked to enter a 6-digit passkey on this device which is |
| /// communicated via the peer device. |
| 4: passkey_entry struct {}; |
| }; |
| |
| /// This protocol is active when a pairing is in progress, and provided to the |
| /// PairingDelegate via the `PairingDelegate.StartRequest` |
| /// The server will close this protocol with an epitaph if the pairing process |
| /// completes early without success: |
| /// - ZX_ERR_UNAVAILABLE - Bluetooth peer has disconnected |
| /// - ZX_ERR_NOT_SUPPORTED - a passkey was provided when it was not expected |
| /// - ZX_ERR_BAD_STATE - a keypress was sent when not using |
| /// PairingProperties.passkey_entry |
| /// - ZX_ERR_TIMED_OUT - no activity was detected, and the pairing was stopped |
| @available(added=HEAD) |
| closed protocol PairingRequest { |
| /// Accept the pairing request. |
| /// entered_passkey is required if the PairingProperties.passkey_entry |
| /// method is used, ignored otherwise. |
| strict Accept(table { |
| 1: entered_passkey uint32; |
| }); |
| |
| /// Reject the pairing request. |
| /// Closing this protocol will also reject the pairing request. |
| strict Reject(); |
| |
| /// Used to communicate local keypresses to update the remote peer on |
| /// the progress of the pairing. The responses to this method should |
| /// be used for flow control. |
| strict Keypress(struct { |
| keypress PairingKeypress; |
| }) -> (); |
| |
| |
| /// Sent when the pairing method is passkey_display. Can be used to |
| /// update the UI to indicate reception of keypresses. |
| strict -> OnKeypress(struct { |
| keypress PairingKeypress; |
| }); |
| |
| /// Sent once when the pairing is completed, just before the protocol is |
| /// closed. |
| /// The success value along with the PeerId will also be sent to the |
| /// delegate using the `PairingDelegate.RequestComplete` call. |
| strict -> OnComplete(struct { |
| success bool; |
| }); |
| }; |
| |
| /// A Bluetooth Pairing Delegate is responsible for confirming or denying |
| /// pairing requests received from Bluetooth peers that connect or are |
| /// being connected to the local device. |
| /// |
| /// Any new pairing will result in a call to `PairingDelegate.StartRequest`, |
| /// including pairings where the InputCapability and OutputCapability are set |
| /// to none. The delegate is expected to have enough context to derive whether |
| /// to accept or reject the pairing. |
| /// |
| /// Only one delegate is allowed to be set per system at a time. See |
| /// `fuchsia.bluetooth.sys.Pairing` for how to set the pairing delegate. |
| @available(added=HEAD) |
| closed protocol PairingDelegate2 { |
| /// Called when a pairing with `peer` is started. The pairing process is |
| /// continued using the PairingRequest protocol. |
| /// |
| /// The properties of the pairing are provided in `info` which indicates |
| /// what type of interaction is intended locally. |
| /// |
| /// Multiple requests can be active at one time for different peers, and |
| /// requests can outlive this protocol. Dropping the request protocol will |
| /// automatically reject the pairing. |
| /// |
| /// All fields will always be present. |
| strict StartRequest(resource table { |
| /// Peer making the request. |
| 1: peer Peer; |
| /// Properties of the pairing. |
| 2: info PairingProperties; |
| /// Protocol used to complete the pairing process. |
| 3: request client_end:PairingRequest; |
| }); |
| |
| /// Called when the pairing procedure for a peer has been completed. This |
| /// can be due to successful completion or an error (e.g. due to |
| /// cancellation by the peer, a timeout, or disconnection). |
| /// |
| /// + request `id` The Bluetooth peer ID of the peer which was being paired |
| /// + request `success` true if the pairing succeeded, otherwise false |
| strict RequestComplete(struct { |
| id bt.PeerId; |
| success bool; |
| }); |
| }; |