| // Copyright 2019 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; |
| |
| struct SecurityProperties { |
| bool authenticated; |
| bool secure_connections; |
| uint8 encryption_key_size; |
| }; |
| |
| /// Represents a 128-bit secret key. |
| struct Key { |
| array<uint8>:16 value; |
| }; |
| |
| /// Represents a key that was received from a peer. |
| struct PeerKey { |
| /// The security properties of this link under which this key was received. |
| SecurityProperties security; |
| |
| /// The contents of the key. |
| Key data; |
| }; |
| |
| /// Represents a locally generated key that is distributed across one or more bonds. |
| alias LocalKey = Key; |
| |
| /// Represents a LE Long-Term peer key used for link encyrption. The `ediv` and `rand` |
| /// fields are zero if distributed using LE Secure Connections pairing. |
| struct Ltk { |
| PeerKey key; |
| uint16 ediv; |
| uint64 rand; |
| }; |
| |
| /// The preferred LE connection parameters of the peer. |
| struct LeConnectionParameters { |
| uint16 connection_interval; |
| uint16 connection_latency; |
| uint16 supervision_timeout; |
| }; |
| |
| [Deprecated = "Use LeBondData instead"] |
| table LeData { |
| /// The identity address of the peer. |
| [Deprecated = "Use fuchsia.bluetooth.sys/BondingData.address instead"] |
| 1: bt.Address address; |
| |
| /// The peer's preferred connection parameters, if known. |
| 2: LeConnectionParameters connection_parameters; |
| |
| /// Known GATT service UUIDs. |
| 3: vector<bt.Uuid>:MAX_PEER_SERVICES services; |
| |
| /// The LE long-term key. Present if the link was encrypted. This field is superseded by the |
| /// `peer_ltk` and `local_ltk` fields. It is invalid for the `ltk` field to be present |
| /// simultaneously with the `peer_ltk` and `local_ltk` fields. In particular: |
| /// |
| /// - LeData generated and notified by the Bluetooth system no longer populates this field. |
| /// - LeData supplied by a client of the Bluetooth system (e.g. |
| /// [`fuchsia.bluetooth.sys/Bootstrap`]) can continue to use this field but is encouraged to |
| /// migrate to the new fields. |
| [Deprecated] |
| 4: Ltk ltk; |
| |
| /// Identity Resolving RemoteKey used to generate and resolve random addresses. |
| 5: PeerKey irk; |
| |
| /// Connection Signature Resolving RemoteKey used for data signing without encryption. |
| 6: PeerKey csrk; |
| |
| /// LE long-term key used to encrypt a connection when the peer is in the LE |
| /// Peripheral role. |
| /// |
| /// In legacy pairing (`peer_ltk.security.secure_connections` is false), |
| /// this key corresponds to the key distributed by the peer. In Secure |
| /// Connections pairing there is only one LTK and `peer_ltk` is the same as |
| /// `local_ltk`. |
| 7: Ltk peer_ltk; |
| |
| /// LE long-term key used to encrypt a connection when the peer is in the LE |
| /// Central role. |
| /// |
| /// In legacy pairing (`local_ltk.security.secure_connections` is false), |
| /// this key corresponds to the key distributed by the local device. In Secure |
| /// Connections pairing there is only one LTK and `local_ltk` is the same as |
| /// `peer_ltk`. |
| 8: Ltk local_ltk; |
| }; |
| |
| [Deprecated = "Use BredrBondData instead"] |
| table BredrData { |
| /// The public device address of the peer. |
| [Deprecated = "Use fuchsia.bluetooth.sys/BondingData.address instead"] |
| 1: bt.Address address; |
| |
| /// The peer's preferred piconet role. This is determined by role switch procedures. Paging and |
| /// connecting from a peer does not automatically set this flag. If absent, the peer has not |
| /// expressed a preference. |
| 2: bt.ConnectionRole role_preference; |
| |
| /// Known service UUIDs obtained from EIR data or SDP. |
| 3: vector<bt.Uuid>:MAX_PEER_SERVICES services; |
| |
| /// The semi-permanent BR/EDR key. Present if link was paired with Secure |
| /// Simple Pairing or stronger. |
| 4: PeerKey link_key; |
| }; |
| |
| table LeBondData { |
| /// The peer's preferred connection parameters, if known. |
| 1: LeConnectionParameters connection_parameters; |
| |
| /// Known GATT service UUIDs. |
| 2: vector<bt.Uuid>:MAX_PEER_SERVICES services; |
| |
| /// Identity Resolving RemoteKey used to generate and resolve random addresses. |
| 3: PeerKey irk; |
| |
| /// Connection Signature Resolving RemoteKey used for data signing without encryption. |
| 4: PeerKey csrk; |
| |
| /// LE long-term key used to encrypt a connection when the peer is in the LE Peripheral role. |
| /// |
| /// In legacy pairing (`peer_ltk.security.secure_connections` is false), this key corresponds |
| /// to the key distributed by the peer. In Secure Connections pairing there is only one LTK and |
| /// `peer_ltk` is the same as `local_ltk`. |
| 5: Ltk peer_ltk; |
| |
| /// LE long-term key used to encrypt a connection when the peer is in the LE Central role. |
| /// |
| /// In legacy pairing (`local_ltk.security.secure_connections` is false), this key corresponds |
| /// to the key distributed by the local device. In Secure Connections pairing there is only one |
| /// LTK and `local_ltk` is the same as `peer_ltk`. |
| 6: Ltk local_ltk; |
| }; |
| |
| table BredrBondData { |
| /// The peer's preferred piconet role. This is determined by role switch procedures. Paging and |
| /// connecting from a peer does not automatically set this flag. If absent, the peer has not |
| /// expressed a preference. |
| 1: bt.ConnectionRole role_preference; |
| |
| /// Known service UUIDs obtained from EIR data or SDP. |
| 2: vector<bt.Uuid>:MAX_PEER_SERVICES services; |
| |
| /// The semi-permanent BR/EDR key. Present if link was paired with Secure Simple Pairing or |
| /// stronger. |
| 3: PeerKey link_key; |
| }; |
| |
| /// Represents the bonding data for a single peer. |
| table BondingData { |
| /// The identifier that uniquely identifies this peer. |
| 1: bt.PeerId identifier; |
| |
| /// The local Bluetooth identity address that this bond is associated with. |
| 2: bt.Address local_address; |
| |
| /// The name of the peer, if known. |
| 3: bt.DeviceName name; |
| |
| /// Bonding data that is present when this peer is paired on the LE transport. |
| /// |
| /// This field is processed by the Bluetooth stack on inbound BondingData, but not present on |
| /// outbound BondingData, where `le_bond` is used instead. Should only be present if `le_bond` |
| /// and `bredr_bond` are absent. |
| [Deprecated = "Use le_bond instead"] |
| 4: LeData le; |
| |
| /// Bonding data that is present when this peer is paired on the BR/EDR transport. |
| /// |
| /// This field is processed by the Bluetooth stack on inbound BondingData, but not present on |
| /// outbound BondingData, where `bredr_bond` is used instead. Should only be present if |
| /// `le_bond` and `bredr_bond` are absent. |
| [Deprecated = "Use bredr_bond instead"] |
| 5: BredrData bredr; |
| |
| /// The identity address of the peer. |
| 6: bt.Address address; |
| |
| /// Bonding data that is present when this peer is paired on the LE transport. |
| 7: LeBondData le_bond; |
| |
| /// Bonding data that is present when this peer is paired on the BR/EDR transport. |
| 8: BredrBondData bredr_bond; |
| }; |
| |
| /// Represents persistent local host data. |
| table HostData { |
| /// The local Identity Resolving Key used by a bt-host device to generate Resolvable Private |
| /// Addresses when privacy is enabled. |
| /// |
| /// May be absent for hosts that do not use LE privacy, or that only use Non-Resolvable Private |
| /// Addresses. |
| /// |
| /// NOTE: This key is distributed to LE peers during pairing procedures. The client must take |
| /// care to assign an IRK that consistent with the local bt-host identity. |
| // TODO(fxbug.dev/1408): Document behavior once there is a better privacy policy when `irk` is null. |
| 1: LocalKey irk; |
| }; |
| |
| /// Represents the persistent configuration of a single host-subsystem instance. This is used for |
| /// identity presentation (inquiry, inquiry response, and advertisement) and for bonding secrets |
| /// recall (encrypting link data to peers associated with this identity). |
| /// |
| /// Each BR/EDR BD_ADDR and Low Energy public identity address used to bond should have its own |
| /// Identity instance containing corresponding peers. |
| /// |
| /// Each Identity instance that supports LE privacy should have an Identity Resolving Key (IRK) that |
| /// is consistent with that distributed to its bonded peers. |
| table Identity { |
| 1: HostData host; |
| |
| /// All bonds that use a public identity address must contain the same local address. |
| 2: vector<BondingData>:MAX bonds; |
| }; |