blob: 16151e9f4dd265ca05e23c47d0fbf53a3ea8d542 [file] [log] [blame]
Qiuhan Ding4caa0cc2015-10-23 20:31:27 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Alexander Afanasyev6aff0242017-08-29 17:14:44 -04002/*
Junxiao Shi68b53852018-07-25 13:56:38 -06003 * Copyright (c) 2013-2018 Regents of the University of California.
Qiuhan Ding4caa0cc2015-10-23 20:31:27 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6 *
7 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20 */
21
22#ifndef NDN_SECURITY_V2_TRUST_ANCHOR_CONTAINER_HPP
23#define NDN_SECURITY_V2_TRUST_ANCHOR_CONTAINER_HPP
24
25#include "trust-anchor-group.hpp"
26#include "certificate.hpp"
27#include "../../interest.hpp"
28
29#include <boost/multi_index_container.hpp>
30#include <boost/multi_index/hashed_index.hpp>
31#include <boost/multi_index/ordered_index.hpp>
32#include <boost/multi_index/mem_fun.hpp>
33
34namespace ndn {
35namespace security {
36namespace v2 {
37
38/**
39 * @brief represents a container for trust anchors.
40 *
41 * There are two kinds of anchors:
42 * - static anchors that are permanent for the lifetime of the container
43 * - dynamic anchors that are periodically updated.
44 *
45 * Trust anchors are organized in groups. Each group has a unique group id. The same anchor
46 * certificate (same name without considering the implicit digest) can be inserted into
47 * multiple groups, but no more than once into each.
48 *
49 * Dynamic groups are created using the appropriate TrustAnchorContainer::insert method. Once
50 * created, the dynamic anchor group cannot be updated.
51 *
52 * The returned pointer to Certificate from `find` methods is only guaranteed to be valid until
53 * the next invocation of `find` and may be invalidated afterwards.
54 */
55class TrustAnchorContainer : noncopyable
56{
57public:
58 class Error : public std::runtime_error
59 {
60 public:
Junxiao Shi68b53852018-07-25 13:56:38 -060061 using std::runtime_error::runtime_error;
Qiuhan Ding4caa0cc2015-10-23 20:31:27 -070062 };
63
64 /**
65 * @brief Insert a static trust anchor.
66 *
67 * @param groupId Certificate group id.
68 * @param cert Certificate to insert.
69 *
70 * If @p cert (same name without considering implicit digest) already exists in the group @p
71 * groupId, this method has no effect.
72 *
73 * @throw Error @p groupId is a dynamic anchor group .
74 */
75 void
76 insert(const std::string& groupId, Certificate&& cert);
77
78 /**
79 * @brief Insert dynamic trust anchors from path.
80 *
81 * @param groupId Certificate group id, must not be empty.
82 * @param path Specifies the path to load the trust anchors.
83 * @param refreshPeriod Refresh period for the trust anchors, must be positive.
84 * Relevant trust anchors will only be updated when find is called
85 * @param isDir Tells whether the path is a directory or a single file.
86 *
87 * @throw std::invalid_argument @p refreshPeriod is not positive
88 * @throw Error a group with @p groupId already exists
89 */
90 void
91 insert(const std::string& groupId, const boost::filesystem::path& path,
92 time::nanoseconds refreshPeriod, bool isDir = false);
93
94 /**
Alexander Afanasyev6aff0242017-08-29 17:14:44 -040095 * @brief Remove all static or dynamic anchors
96 */
97 void
98 clear();
99
100 /**
Qiuhan Ding4caa0cc2015-10-23 20:31:27 -0700101 * @brief Search for certificate across all groups (longest prefix match)
102 * @param keyName Key name prefix for searching the certificate.
103 * @return The found certificate, nullptr if not found.
104 *
105 * @note The returned value may be invalidated after next call to one of `find` methods.
106 */
107 const Certificate*
108 find(const Name& keyName) const;
109
110 /**
111 * @brief Find certificate given interest
112 * @param interest The input interest packet.
113 * @return The found certificate, nullptr if not found.
114 *
115 * @note The returned value may be invalidated after next call to one of `find` methods.
116 *
117 * @note Interest with implicit digest is not supported.
118 *
119 * @note ChildSelector is not supported.
120 */
121 const Certificate*
122 find(const Interest& interest) const;
123
124 /**
125 * @brief Get trusted anchor group
126 * @throw Error @p groupId does not exist
127 */
128 TrustAnchorGroup&
129 getGroup(const std::string& groupId) const;
130
131 /**
132 * @brief Get number of trust anchors across all groups
133 */
134 size_t
135 size() const;
136
137private:
138 void
139 refresh();
140
141private:
142 using AnchorContainerBase = boost::multi_index::multi_index_container<
143 Certificate,
144 boost::multi_index::indexed_by<
145 boost::multi_index::ordered_unique<
146 boost::multi_index::const_mem_fun<Data, const Name&, &Data::getName>
147 >
148 >
149 >;
150
151 class AnchorContainer : public CertContainerInterface,
152 public AnchorContainerBase
153 {
154 public:
155 void
156 add(Certificate&& cert) final;
157
158 void
159 remove(const Name& certName) final;
Alexander Afanasyev6aff0242017-08-29 17:14:44 -0400160
161 void
162 clear();
Qiuhan Ding4caa0cc2015-10-23 20:31:27 -0700163 };
164
165 using GroupContainer = boost::multi_index::multi_index_container<
166 shared_ptr<TrustAnchorGroup>,
167 boost::multi_index::indexed_by<
168 boost::multi_index::hashed_unique<
169 boost::multi_index::const_mem_fun<TrustAnchorGroup, const std::string&, &TrustAnchorGroup::getId>
170 >
171 >
172 >;
173
174 GroupContainer m_groups;
175 AnchorContainer m_anchors;
176};
177
178} // namespace v2
179} // namespace security
180} // namespace ndn
181
182#endif // NDN_SECURITY_V2_TRUST_ANCHOR_CONTAINER_HPP