blob: 3f6d5cabf7d77acfc095741e1c899d787229ddf4 [file] [log] [blame]
// 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;
};