blob: f9355718f36335895a5b1f2e86b9eedb0d544573 [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/*
Qiuhan Ding4caa0cc2015-10-23 20:31:27 -07003 * Copyright (c) 2013-2017 Regents of the University of California.
4 *
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:
61 explicit
62 Error(const std::string& what)
63 : std::runtime_error(what)
64 {
65 }
66 };
67
68 /**
69 * @brief Insert a static trust anchor.
70 *
71 * @param groupId Certificate group id.
72 * @param cert Certificate to insert.
73 *
74 * If @p cert (same name without considering implicit digest) already exists in the group @p
75 * groupId, this method has no effect.
76 *
77 * @throw Error @p groupId is a dynamic anchor group .
78 */
79 void
80 insert(const std::string& groupId, Certificate&& cert);
81
82 /**
83 * @brief Insert dynamic trust anchors from path.
84 *
85 * @param groupId Certificate group id, must not be empty.
86 * @param path Specifies the path to load the trust anchors.
87 * @param refreshPeriod Refresh period for the trust anchors, must be positive.
88 * Relevant trust anchors will only be updated when find is called
89 * @param isDir Tells whether the path is a directory or a single file.
90 *
91 * @throw std::invalid_argument @p refreshPeriod is not positive
92 * @throw Error a group with @p groupId already exists
93 */
94 void
95 insert(const std::string& groupId, const boost::filesystem::path& path,
96 time::nanoseconds refreshPeriod, bool isDir = false);
97
98 /**
Alexander Afanasyev6aff0242017-08-29 17:14:44 -040099 * @brief Remove all static or dynamic anchors
100 */
101 void
102 clear();
103
104 /**
Qiuhan Ding4caa0cc2015-10-23 20:31:27 -0700105 * @brief Search for certificate across all groups (longest prefix match)
106 * @param keyName Key name prefix for searching the certificate.
107 * @return The found certificate, nullptr if not found.
108 *
109 * @note The returned value may be invalidated after next call to one of `find` methods.
110 */
111 const Certificate*
112 find(const Name& keyName) const;
113
114 /**
115 * @brief Find certificate given interest
116 * @param interest The input interest packet.
117 * @return The found certificate, nullptr if not found.
118 *
119 * @note The returned value may be invalidated after next call to one of `find` methods.
120 *
121 * @note Interest with implicit digest is not supported.
122 *
123 * @note ChildSelector is not supported.
124 */
125 const Certificate*
126 find(const Interest& interest) const;
127
128 /**
129 * @brief Get trusted anchor group
130 * @throw Error @p groupId does not exist
131 */
132 TrustAnchorGroup&
133 getGroup(const std::string& groupId) const;
134
135 /**
136 * @brief Get number of trust anchors across all groups
137 */
138 size_t
139 size() const;
140
141private:
142 void
143 refresh();
144
145private:
146 using AnchorContainerBase = boost::multi_index::multi_index_container<
147 Certificate,
148 boost::multi_index::indexed_by<
149 boost::multi_index::ordered_unique<
150 boost::multi_index::const_mem_fun<Data, const Name&, &Data::getName>
151 >
152 >
153 >;
154
155 class AnchorContainer : public CertContainerInterface,
156 public AnchorContainerBase
157 {
158 public:
159 void
160 add(Certificate&& cert) final;
161
162 void
163 remove(const Name& certName) final;
Alexander Afanasyev6aff0242017-08-29 17:14:44 -0400164
165 void
166 clear();
Qiuhan Ding4caa0cc2015-10-23 20:31:27 -0700167 };
168
169 using GroupContainer = boost::multi_index::multi_index_container<
170 shared_ptr<TrustAnchorGroup>,
171 boost::multi_index::indexed_by<
172 boost::multi_index::hashed_unique<
173 boost::multi_index::const_mem_fun<TrustAnchorGroup, const std::string&, &TrustAnchorGroup::getId>
174 >
175 >
176 >;
177
178 GroupContainer m_groups;
179 AnchorContainer m_anchors;
180};
181
182} // namespace v2
183} // namespace security
184} // namespace ndn
185
186#endif // NDN_SECURITY_V2_TRUST_ANCHOR_CONTAINER_HPP