Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0dea9752 authored by Chris Manton's avatar Chris Manton
Browse files

Save bonding and pairing state to security record

Bug: 142341141
Test: bluetooth_test_gd

Change-Id: I226d9f2f74e12d911fbb8e1f3d5924db7763bdaf
parent b7ea929a
Loading
Loading
Loading
Loading
+33 −16
Original line number Original line Diff line number Diff line
@@ -28,43 +28,55 @@ namespace bluetooth {
namespace security {
namespace security {
namespace record {
namespace record {


enum BondState {
  /* CreateBond was called, or remote send Pairing Request */
  PAIRING,
  /* Link key has been exchanged, but not stored */
  PAIRED,
  /* Link Keys are stored persistently */
  BONDED
};

class SecurityRecord {
class SecurityRecord {
 public:
 public:
  explicit SecurityRecord(hci::AddressWithType address) : pseudo_address_(address), state_(PAIRING) {}
  explicit SecurityRecord(hci::AddressWithType address) : pseudo_address_(address), pairing_(true) {}


  SecurityRecord& operator=(const SecurityRecord& other) = default;
  SecurityRecord& operator=(const SecurityRecord& other) = default;


  /**
  /**
   * Returns true if Link Keys are stored persistently
   * Returns true if a device is currently pairing to another device
   */
   */
  bool IsBonded() {
  bool IsPairing() const {
    return state_ == BONDED;
    return pairing_;
  }
  }


  /* Link key has been exchanged, but not stored */
  /* Link key has been exchanged, but not stored */
  bool IsPaired() {
  bool IsPaired() const {
    return state_ == PAIRED;
    return IsClassicLinkKeyValid();
  }

  /**
   * Returns true if Link Keys are stored persistently
   */
  bool IsBonded() const {
    return IsPaired() && persisted_;
  }

  /**
   * Called by storage manager once record has persisted
   */
  void SetPersisted(bool persisted) {
    persisted_ = persisted;
  }
  }


  void SetLinkKey(std::array<uint8_t, 16> link_key, hci::KeyType key_type) {
  void SetLinkKey(std::array<uint8_t, 16> link_key, hci::KeyType key_type) {
    link_key_ = link_key;
    link_key_ = link_key;
    key_type_ = key_type;
    key_type_ = key_type;
    CancelPairing();
  }

  void CancelPairing() {
    pairing_ = false;
  }
  }


  std::array<uint8_t, 16> GetLinkKey() {
  std::array<uint8_t, 16> GetLinkKey() {
    ASSERT(IsClassicLinkKeyValid());
    return link_key_;
    return link_key_;
  }
  }


  hci::KeyType GetKeyType() {
  hci::KeyType GetKeyType() {
    ASSERT(IsClassicLinkKeyValid());
    return key_type_;
    return key_type_;
  }
  }


@@ -76,10 +88,15 @@ class SecurityRecord {
  /* First address we have ever seen this device with, that we used to create bond */
  /* First address we have ever seen this device with, that we used to create bond */
  hci::AddressWithType pseudo_address_;
  hci::AddressWithType pseudo_address_;


  BondState state_;
  std::array<uint8_t, 16> link_key_ = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  std::array<uint8_t, 16> link_key_ = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  hci::KeyType key_type_ = hci::KeyType::DEBUG_COMBINATION;
  hci::KeyType key_type_ = hci::KeyType::DEBUG_COMBINATION;


  bool IsClassicLinkKeyValid() const {
    return !std::all_of(link_key_.begin(), link_key_.end(), [](uint8_t b) { return b == 0; });
  }
  bool persisted_ = false;
  bool pairing_ = false;

 public:
 public:
  /* Identity Address */
  /* Identity Address */
  std::optional<hci::AddressWithType> identity_address_;
  std::optional<hci::AddressWithType> identity_address_;