| // 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; |
| |
| type SecurityProperties = struct { |
| authenticated bool; |
| secure_connections bool; |
| encryption_key_size uint8; |
| }; |
| |
| /// Represents a 128-bit secret key. |
| type Key = struct { |
| value array<uint8, 16>; |
| }; |
| |
| /// Represents a key that was received from a peer. |
| type PeerKey = struct { |
| /// The security properties of this link under which this key was received. |
| security SecurityProperties; |
| |
| /// The contents of the key. |
| data Key; |
| }; |
| |
| /// 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. |
| type Ltk = struct { |
| key PeerKey; |
| ediv uint16; |
| rand uint64; |
| }; |
| |
| /// The preferred LE connection parameters of the peer. |
| type LeConnectionParameters = struct { |
| connection_interval uint16; |
| connection_latency uint16; |
| supervision_timeout uint16; |
| }; |
| |
| type LeBondData = table { |
| /// The peer's preferred connection parameters, if known. |
| 1: connection_parameters LeConnectionParameters; |
| |
| /// Known GATT service UUIDs. |
| 2: services vector<bt.Uuid>:MAX_PEER_SERVICES; |
| |
| /// Identity Resolving RemoteKey used to generate and resolve random addresses. |
| 3: irk PeerKey; |
| |
| /// Connection Signature Resolving RemoteKey used for data signing without encryption. |
| 4: csrk PeerKey; |
| |
| /// 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: peer_ltk 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: local_ltk Ltk; |
| }; |
| |
| type BredrBondData = table { |
| /// 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: role_preference bt.ConnectionRole; |
| |
| /// Known service UUIDs obtained from EIR data or SDP. |
| 2: services vector<bt.Uuid>:MAX_PEER_SERVICES; |
| |
| /// The semi-permanent BR/EDR key. Present if link was paired with Secure Simple Pairing or |
| /// stronger. |
| 3: link_key PeerKey; |
| }; |
| |
| /// Represents the bonding data for a single peer. |
| type BondingData = table { |
| /// The identifier that uniquely identifies this peer. |
| 1: identifier bt.PeerId; |
| |
| /// The local Bluetooth identity address that this bond is associated with. |
| 2: local_address bt.Address; |
| |
| /// The name of the peer, if known. |
| 3: name bt.DeviceName; |
| |
| 4: reserved; |
| 5: reserved; |
| |
| /// The identity address of the peer. |
| 6: address bt.Address; |
| |
| /// Bonding data that is present when this peer is paired on the LE transport. |
| 7: le_bond LeBondData; |
| |
| /// Bonding data that is present when this peer is paired on the BR/EDR transport. |
| 8: bredr_bond BredrBondData; |
| }; |
| |
| /// Represents persistent local host data. |
| type HostData = table { |
| /// 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: irk LocalKey; |
| }; |
| |
| /// 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. |
| type Identity = table { |
| 1: host HostData; |
| |
| /// All bonds that use a public identity address must contain the same local address. |
| 2: bonds vector<BondingData>:MAX; |
| }; |