aboutsummaryrefslogtreecommitdiff
path: root/gd/security/security_record_database.h
blob: 23604757fb3ed686627cb8729b2a15bdf270bccb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/*
 * Copyright 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include "security/record/security_record.h"

namespace bluetooth {
namespace security {

class SecurityRecordDatabase {
 public:
  using iterator = std::vector<record::SecurityRecord>::iterator;

  record::SecurityRecord& FindOrCreate(hci::AddressWithType address) {
    auto it = Find(address);
    // Security record check
    if (it != records_.end()) return *it;

    // No security record, create one
    records_.emplace_back(address);
    return records_.back();
  }

  void Remove(const hci::AddressWithType& address) {
    auto it = Find(address);

    // No record exists
    if (it == records_.end()) return;

    record::SecurityRecord& last = records_.back();
    *it = std::move(last);
    records_.pop_back();
  }

  iterator Find(hci::AddressWithType address) {
    for (auto it = records_.begin(); it != records_.end(); ++it) {
      record::SecurityRecord& record = *it;
      if (record.identity_address_.has_value() && record.identity_address_.value() == address) return it;
      if (record.GetPseudoAddress() == address) return it;
      if (record.irk.has_value() && address.IsRpaThatMatchesIrk(record.irk.value())) return it;
    }
    return records_.end();
  }

  std::vector<record::SecurityRecord> records_;
};

}  // namespace security
}  // namespace bluetooth