blob: 5bfb0b15ee1f940d1320b4857a94b36bd5f04503 [file] [log] [blame]
Alexander Afanasyeve96538a2018-06-13 20:32:53 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesaventod51d9602019-07-20 23:33:06 -04002/*
Davide Pesaventobde084f2022-04-17 00:21:35 -04003 * Copyright (c) 2014-2022, Regents of the University of California
Alexander Afanasyeve96538a2018-06-13 20:32:53 -04004 *
5 * NAC library is free software: you can redistribute it and/or modify it under the
6 * terms of the GNU Lesser General Public License as published by the Free Software
7 * Foundation, either version 3 of the License, or (at your option) any later version.
8 *
9 * NAC library is distributed in the hope that it will be useful, but WITHOUT ANY
10 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
11 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
12 *
13 * You should have received copies of the GNU General Public License and GNU Lesser
14 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
15 * <http://www.gnu.org/licenses/>.
16 *
17 * See AUTHORS.md for complete list of NAC library authors and contributors.
18 */
19
20#ifndef NDN_NAC_ACCESS_MANAGER_HPP
21#define NDN_NAC_ACCESS_MANAGER_HPP
22
23#include "common.hpp"
24
25#include <ndn-cxx/face.hpp>
26
Davide Pesaventobde084f2022-04-17 00:21:35 -040027namespace ndn::nac {
Alexander Afanasyeve96538a2018-06-13 20:32:53 -040028
29/**
30 * @brief Access Manager
31 *
32 * Access Manager controls decryption policy by publishing granular per-namespace access
33 * policies in the form of key encryption (KEK, plaintext public) and key decryption (KDK,
Alexander Afanasyev1a21e102018-06-13 20:33:21 -040034 * encrypted private key) key pair.
Alexander Afanasyeve96538a2018-06-13 20:32:53 -040035 *
Alexander Afanasyev1a21e102018-06-13 20:33:21 -040036 * @todo Rolling KEK
Alexander Afanasyeve96538a2018-06-13 20:32:53 -040037 */
38class AccessManager
39{
40public:
41 class Error : public std::runtime_error
42 {
43 public:
44 using std::runtime_error::runtime_error;
45 };
46
47public:
48 /**
Alexander Afanasyeve96538a2018-06-13 20:32:53 -040049 * @param identity Data owner's namespace identity (will be used to sign KEK and KDK)
50 * @param dataset Name of dataset that this manager is controlling
51 * @param keyChain KeyChain
52 * @param face Face that will be used to publish KEK and KDKs
53 *
Alexander Afanasyev1a21e102018-06-13 20:33:21 -040054 * KEK and KDK naming:
Alexander Afanasyeve96538a2018-06-13 20:32:53 -040055 *
Alexander Afanasyev1a21e102018-06-13 20:33:21 -040056 * [identity]/NAC/[dataset]/KEK /[key-id] (== KEK, public key)
Alexander Afanasyeve96538a2018-06-13 20:32:53 -040057 *
Alexander Afanasyev1a21e102018-06-13 20:33:21 -040058 * [identity]/NAC/[dataset]/KDK/[key-id] /ENCRYPTED-BY/[user]/KEY/[key-id] (== KDK, encrypted private key)
Alexander Afanasyeve96538a2018-06-13 20:32:53 -040059 *
60 * \_____________ ______________/
61 * \/
62 * registered with NFD
63 *
64 * AccessManager serves NAC public key for data producers to fetch and encrypted versions of
65 * private keys (as safe bags) for authorized consumers to fetch.
66 */
67 AccessManager(const Identity& identity, const Name& dataset,
68 KeyChain& keyChain, Face& face);
69
Alexander Afanasyeve96538a2018-06-13 20:32:53 -040070 /**
71 * @brief Authorize a member identified by its certificate @p memberCert to decrypt data
72 * under the policy
Alexander Afanasyev2b57aeb2018-06-15 18:32:28 -040073 * @return published KDK
Alexander Afanasyeve96538a2018-06-13 20:32:53 -040074 */
Alexander Afanasyev2b57aeb2018-06-15 18:32:28 -040075 Data
Alexander Afanasyeve96538a2018-06-13 20:32:53 -040076 addMember(const Certificate& memberCert);
77
78 // void
79 // addMemberWithKey(const Name& keyName);
80
81 // void
82 // addMemberWithIdentity(const Name& identityName);
83
84 /**
85 * @brief Remove member with name @p identity from the group
86 */
87 void
88 removeMember(const Name& identity);
89
90public: // accessor interface for published data packets
91
92 /** @return{ number of packets stored in in-memory storage }
93 */
94 size_t
95 size() const
96 {
97 return m_ims.size();
98 }
99
Alexander Afanasyev1a21e102018-06-13 20:33:21 -0400100 /** @brief Returns begin iterator of the in-memory storage ordered by
Alexander Afanasyeve96538a2018-06-13 20:32:53 -0400101 * name with digest
102 *
Alexander Afanasyev1a21e102018-06-13 20:33:21 -0400103 * @return{ const_iterator pointing to the beginning of m_cache }
Alexander Afanasyeve96538a2018-06-13 20:32:53 -0400104 */
105 InMemoryStorage::const_iterator
106 begin() const
107 {
108 return m_ims.begin();
109 }
110
Alexander Afanasyev1a21e102018-06-13 20:33:21 -0400111 /** @brief Returns end iterator of the in-memory storage ordered by
Alexander Afanasyeve96538a2018-06-13 20:32:53 -0400112 * name with digest
113 *
Alexander Afanasyev1a21e102018-06-13 20:33:21 -0400114 * @return{ const_iterator pointing to the end of m_cache }
Alexander Afanasyeve96538a2018-06-13 20:32:53 -0400115 */
116 InMemoryStorage::const_iterator
117 end() const
118 {
119 return m_ims.end();
120 }
121
122private:
123 Identity m_identity;
124 Key m_nacKey;
125 KeyChain& m_keyChain;
126 Face& m_face;
127
Alexander Afanasyev1a21e102018-06-13 20:33:21 -0400128 InMemoryStoragePersistent m_ims; // for KEK and KDKs
Davide Pesaventod51d9602019-07-20 23:33:06 -0400129 ScopedRegisteredPrefixHandle m_kekReg;
130 ScopedRegisteredPrefixHandle m_kdkReg;
Alexander Afanasyeve96538a2018-06-13 20:32:53 -0400131};
132
Davide Pesaventobde084f2022-04-17 00:21:35 -0400133} // namespace ndn::nac
Alexander Afanasyeve96538a2018-06-13 20:32:53 -0400134
135#endif // NDN_NAC_ACCESS_MANAGER_HPP