config-policy-manager.hpp
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
24 #ifndef NDN_CONFIG_POLICY_MANAGER_HPP
25 #define NDN_CONFIG_POLICY_MANAGER_HPP
26 
27 #include <string>
28 #include <vector>
29 #include <map>
30 #include <ndn-cpp/security/policy/certificate-cache.hpp>
31 #include "policy-manager.hpp"
32 
34 
35 namespace ndn {
36 
37 class BoostInfoTree;
38 class BoostInfoParser;
39 class IdentityCertificate;
40 
57 public:
79  (const std::string& configFileName = "",
80  const ptr_lib::shared_ptr<CertificateCache>& certificateCache =
81  ptr_lib::shared_ptr<CertificateCache>(), int searchDepth = 5,
82  Milliseconds graceInterval = 3000, Milliseconds keyTimestampTtl = 3600000,
83  int maxTrackedKeys = 1000);
84 
88  virtual
90 
94  void
95  reset();
96 
102  void
103  load(const std::string& configFileName);
104 
111  void
112  load(const std::string& input, const std::string& inputName);
113 
122  virtual bool
123  skipVerifyAndTrust(const Data& data);
124 
133  virtual bool
134  skipVerifyAndTrust(const Interest& interest);
135 
143  virtual bool
144  requireVerify(const Data& data);
145 
154  virtual bool
155  requireVerify(const Interest& interest);
156 
169  virtual ptr_lib::shared_ptr<ValidationRequest>
171  (const ptr_lib::shared_ptr<Data>& data, int stepCount,
172  const OnVerified& onVerified, const OnVerifyFailed& onVerifyFailed);
173 
186  virtual ptr_lib::shared_ptr<ValidationRequest>
188  (const ptr_lib::shared_ptr<Interest>& interest, int stepCount,
189  const OnVerifiedInterest& onVerified,
190  const OnVerifyInterestFailed& onVerifyFailed, WireFormat& wireFormat);
191 
200  virtual bool
201  checkSigningPolicy(const Name& dataName, const Name& certificateName);
202 
209  virtual Name
210  inferSigningIdentity(const Name& dataName);
211 
212 private:
213  // Allow the unit tests to call private members.
214  friend class ::TestVerificationRulesFriend;
215 
220  class TrustAnchorRefreshManager {
221  public:
222  TrustAnchorRefreshManager()
223  {
224  }
225 
226  static ptr_lib::shared_ptr<IdentityCertificate>
227  loadIdentityCertificateFromFile(const std::string& filename);
228 
229  ptr_lib::shared_ptr<IdentityCertificate>
230  getCertificate(Name certificateName) const
231  {
232  // Assume the timestamp is already removed.
233  return certificateCache_.getCertificate(certificateName);
234  }
235 
236  void
237  addDirectory(const std::string& directoryName, Milliseconds refreshPeriod);
238 
239  void
240  refreshAnchors();
241 
242  private:
243  class DirectoryInfo {
244  public:
245  DirectoryInfo
246  (const std::vector<std::string>& certificateNames,
247  MillisecondsSince1970 nextRefresh, Milliseconds refreshPeriod)
248  : certificateNames_(certificateNames), nextRefresh_(nextRefresh),
249  refreshPeriod_(refreshPeriod)
250  {
251  }
252 
253  std::vector<std::string> certificateNames_;
254  MillisecondsSince1970 nextRefresh_;
255  Milliseconds refreshPeriod_;
256  };
257 
258  CertificateCache certificateCache_;
259  // refreshDirectories_ maps the directory name to certificate names so they
260  // can be deleted when necessary, and the next refresh time.
261  std::map<std::string, ptr_lib::shared_ptr<DirectoryInfo> > refreshDirectories_;
262  };
263 
270  void
271  loadTrustAnchorCertificates();
272 
285  bool
286  checkSignatureMatch
287  (const Name& signatureName, const Name& objectName, const BoostInfoTree& rule);
288 
297  ptr_lib::shared_ptr<IdentityCertificate>
298  lookupCertificate(const std::string& certID, bool isPath);
299 
309  const BoostInfoTree*
310  findMatchingRule(const Name& objName, const std::string& matchType) const;
311 
325  static bool
326  matchesRelation
327  (const Name& name, const Name& matchName, const std::string& matchRelation);
328 
336  static ptr_lib::shared_ptr<Signature>
337  extractSignature(const Interest& interest, WireFormat& wireFormat);
338 
346  bool
347  interestTimestampIsFresh(const Name& keyName, MillisecondsSince1970 timestamp) const;
348 
357  void
358  updateTimestampForKey(const Name& keyName, MillisecondsSince1970 timestamp);
359 
371  bool
372  verify(const Signature* signatureInfo, const SignedBlob& signedBlob) const;
373 
388  ptr_lib::shared_ptr<Interest>
389  getCertificateInterest
390  (int stepCount, const std::string& matchType, const Name& objectName,
391  const Signature* signature);
392 
405  void
406  onCertificateDownloadComplete
407  (const ptr_lib::shared_ptr<Data> &data,
408  const ptr_lib::shared_ptr<Data> &originalData, int stepCount,
409  const OnVerified& onVerified, const OnVerifyFailed& onVerifyFailed);
410 
423  void
424  onCertificateDownloadCompleteForInterest
425  (const ptr_lib::shared_ptr<Data> &data,
426  const ptr_lib::shared_ptr<Interest> &originalInterest, int stepCount,
427  const OnVerifiedInterest& onVerified,
428  const OnVerifyInterestFailed& onVerifyFailed, WireFormat& wireFormat);
429 
430  ptr_lib::shared_ptr<CertificateCache> certificateCache_;
431  int maxDepth_;
432  Milliseconds keyGraceInterval_;
433  Milliseconds keyTimestampTtl_;
434  int maxTrackedKeys_;
435  // fixedCertificateCache_ stores the fixed-signer certificate name associated with
436  // validation rules so we don't keep loading from files.
437  std::map<std::string, std::string> fixedCertificateCache_;
438  // keyTimestamps_ stores the timestamps for each public key used in command
439  // interests to avoid replay attacks.
440  // key is the public key name, value is the last timestamp.
441  std::map<std::string, MillisecondsSince1970> keyTimestamps_;
442  ptr_lib::shared_ptr<BoostInfoParser> config_;
443  bool requiresVerification_;
444  ptr_lib::shared_ptr<TrustAnchorRefreshManager> refreshManager_;
445 };
446 
447 }
448 
449 #endif
double Milliseconds
A time interval represented as the number of milliseconds.
Definition: common.hpp:111
A ConfigPolicyManager manages trust according to a configuration file in the Validator Configuration ...
Definition: config-policy-manager.hpp:56
func_lib::function< void(const ptr_lib::shared_ptr< Interest > &interest)> OnVerifyInterestFailed
An OnVerifyInterestFailed function object is used to pass a callback to verifyInterest to report a fa...
Definition: validation-request.hpp:52
Copyright (C) 2013-2016 Regents of the University of California.
Definition: common.hpp:35
func_lib::function< void(const ptr_lib::shared_ptr< Interest > &interest)> OnVerifiedInterest
An OnVerifiedInterest function object is used to pass a callback to verifyInterest to report a succes...
Definition: validation-request.hpp:45
virtual ptr_lib::shared_ptr< ValidationRequest > checkVerificationPolicy(const ptr_lib::shared_ptr< Data > &data, int stepCount, const OnVerified &onVerified, const OnVerifyFailed &onVerifyFailed)
Check whether the received data packet complies with the verification policy, and get the indication ...
virtual bool skipVerifyAndTrust(const Data &data)
Check if the received data packet can escape from verification and be trusted as valid.
Definition: data.hpp:35
void reset()
Reset the certificate cache and other fields to the constructor state.
virtual bool requireVerify(const Data &data)
Check if this PolicyManager has a verification rule for the received data.
ConfigPolicyManager(const std::string &configFileName="", const ptr_lib::shared_ptr< CertificateCache > &certificateCache=ptr_lib::shared_ptr< CertificateCache >(), int searchDepth=5, Milliseconds graceInterval=3000, Milliseconds keyTimestampTtl=3600000, int maxTrackedKeys=1000)
Create a new ConfigPolicyManager which will act on the rules specified in the configuration and downl...
func_lib::function< void(const ptr_lib::shared_ptr< Data > &data)> OnVerified
An OnVerified function object is used to pass a callback to verifyData to report a successful verific...
Definition: validation-request.hpp:33
BoostInfoTree is provided for compatibility with the Boost INFO property list format used in ndn-cxx...
Definition: boost-info-parser.hpp:46
virtual Name inferSigningIdentity(const Name &dataName)
Infer the signing identity name according to the policy.
virtual ~ConfigPolicyManager()
The virtual destructor.
A Name holds an array of Name::Component and represents an NDN name.
Definition: name.hpp:40
A Signature is an abstract base class providing methods to work with the signature information in a D...
Definition: signature.hpp:35
An Interest holds a Name and other fields for an interest.
Definition: interest.hpp:38
TestVerificationRulesFriend is a friend of ConfigPolicyManager so we can call its private members thr...
Definition: test-verification-rules.cpp:140
void load(const std::string &configFileName)
Call reset() and load the configuration rules from the file.
double MillisecondsSince1970
The calendar time represented as the number of milliseconds since 1/1/1970.
Definition: common.hpp:116
func_lib::function< void(const ptr_lib::shared_ptr< Data > &data)> OnVerifyFailed
An OnVerifyFailed function object is used to pass a callback to verifyData to report a failed verific...
Definition: validation-request.hpp:38
virtual bool checkSigningPolicy(const Name &dataName, const Name &certificateName)
Override to always indicate that the signing certificate name and data name satisfy the signing polic...
A SignedBlob extends Blob to keep the offsets of a signed portion (e.g., the bytes of Data packet)...
Definition: signed-blob.hpp:34
Definition: wire-format.hpp:36
A PolicyManager is an abstract base class to represent the policy for verifying data packets...
Definition: policy-manager.hpp:37
A CertificateCache is used to save other users' certificate during verification.
Definition: certificate-cache.hpp:36