// Copyright 2018 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.control;

struct SecurityProperties {
  bool authenticated;
  bool secure_connections;
  uint8 encryption_key_size;
};

struct Key {
  // The security properties of this link under which this key was exchanged.
  SecurityProperties security_properties;

  // 128 bit key
  array<uint8>:16 value;
};

// Represents a LE Long-Term Key. The |ediv| and |rand| fields are zero if
// distributed using LE Secure Connections pairing.
struct LTK {
  Key key;
  uint8 key_size;
  uint16 ediv;
  uint64 rand;
};

// The preferred LE connection parameters of the peer.
// TODO(bwb): to move LEConnectionParameters to BLE library.
struct LEConnectionParameters {
  uint16 connection_interval;
  uint16 connection_latency;
  uint16 supervision_timeout;
};

enum AddressType: uint8 {
  LE_PUBLIC = 0;
  LE_RANDOM = 1;
  BREDR = 2;
};

struct LEData {
  // The identity address of the peer. If |resolvable| is true, then this is the
  // resolved private address (and the |irk| is present).
  string address;

  AddressType address_type;

  // The peer’s preferred connection parameters, if known.
  LEConnectionParameters? connection_parameters;

  // Known GATT service UUIDs.
  vector<string> services;

  // The LE long-term key. Present if the link was encrypted.
  LTK? ltk;

  // Identity Resolving Key used to generate and resolve random addresses.
  Key? irk;

  // Connection Signature Resolving Key used for data signing without encryption.
  Key? csrk;
};

struct BondingData {
  string identifier;

  LEData? le;

  // TODO Add BR/EDR data
};

interface Bonding {
  // Initializes bonded devices for the local host identified by |local_id|. This is the same
  // as the ID provided in OnDeviceBonded().
  1: AddBondedDevices(string local_id, vector<BondingData> bonds) -> (fuchsia.bluetooth.Status status);

  // TODO(NET-1156) Make an interface to bootstrap bt-gap with the BondingData

  // Called when the pairing procedure with a new peer has completed or when new data for an
  // existing bond is available.
  101: -> OnNewBondingData(string local_id, BondingData data);

  // Called when the bonding data for an existing peer should be removed
  102: -> OnDeleteBond(string local_id);
};
