blob: fc059693de68917193d63dbd2364cd9158518f82 [file] [log] [blame]
Jeff Thompson25b4e612013-10-10 16:03:24 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
Jeff Thompson47c93cf2013-08-09 00:38:48 -07002/**
Jeff Thompson7687dc02013-09-13 11:54:07 -07003 * Copyright (C) 2013 Regents of the University of California.
Jeff Thompsonba16b8f2013-12-16 13:11:47 -08004 * @author: Yingdi Yu <yingdi@cs.ucla.edu>
Jeff Thompson7687dc02013-09-13 11:54:07 -07005 * @author: Jeff Thompson <jefft0@remap.ucla.edu>
Jeff Thompson47c93cf2013-08-09 00:38:48 -07006 * See COPYING for copyright and distribution information.
7 */
8
Jeff Thompson9296f0c2013-09-23 18:10:27 -07009#include "../util/logging.hpp"
Jeff Thompson25b4e612013-10-10 16:03:24 -070010#include <ndn-cpp/security/security-exception.hpp>
11#include <ndn-cpp/security/policy/policy-manager.hpp>
12#include <ndn-cpp/security/key-chain.hpp>
Jeff Thompson47c93cf2013-08-09 00:38:48 -070013
14using namespace std;
Jeff Thompsond4144fe2013-09-18 15:59:57 -070015using namespace ndn::ptr_lib;
Jeff Thompson2381da82013-11-06 14:34:09 -080016using namespace ndn::func_lib;
Jeff Thompson9bdeb6d2013-11-06 14:30:07 -080017#if NDN_CPP_HAVE_STD_FUNCTION
Jeff Thompson09324ed2013-11-06 14:40:35 -080018// In the std library, the placeholders are in a different namespace than boost.
19using namespace ndn::func_lib::placeholders;
Jeff Thompson9bdeb6d2013-11-06 14:30:07 -080020#endif
Jeff Thompson47c93cf2013-08-09 00:38:48 -070021
22namespace ndn {
Jeff Thompson15966392013-12-04 17:37:17 -080023
Jeff Thompson29ce3102013-09-27 11:47:48 -070024KeyChain::KeyChain(const shared_ptr<IdentityManager>& identityManager, const shared_ptr<PolicyManager>& policyManager)
25: identityManager_(identityManager), policyManager_(policyManager), face_(0), maxSteps_(100)
Jeff Thompson9296f0c2013-09-23 18:10:27 -070026{
27}
28
Jeff Thompson2ce8f492013-09-17 18:01:25 -070029void
Jeff Thompson29ce3102013-09-27 11:47:48 -070030KeyChain::sign(Data& data, const Name& certificateName, WireFormat& wireFormat)
Jeff Thompson2ce8f492013-09-17 18:01:25 -070031{
Jeff Thompson29ce3102013-09-27 11:47:48 -070032 identityManager_->signByCertificate(data, certificateName, wireFormat);
33}
34
Jeff Thompsonc01e1782013-10-21 14:08:42 -070035shared_ptr<Signature>
36KeyChain::sign(const uint8_t* buffer, size_t bufferLength, const Name& certificateName)
37{
38 return identityManager_->signByCertificate(buffer, bufferLength, certificateName);
39}
40
Jeff Thompson29ce3102013-09-27 11:47:48 -070041void
42KeyChain::signByIdentity(Data& data, const Name& identityName, WireFormat& wireFormat)
43{
44 Name signingCertificateName;
Jeff Thompson9296f0c2013-09-23 18:10:27 -070045
Jeff Thompson29ce3102013-09-27 11:47:48 -070046 if (identityName.getComponentCount() == 0) {
47 Name inferredIdentity = policyManager_->inferSigningIdentity(data.getName());
48 if (inferredIdentity.getComponentCount() == 0)
49 signingCertificateName = identityManager_->getDefaultCertificateName();
50 else
51 signingCertificateName = identityManager_->getDefaultCertificateNameForIdentity(inferredIdentity);
Jeff Thompson2ce8f492013-09-17 18:01:25 -070052 }
Jeff Thompson9296f0c2013-09-23 18:10:27 -070053 else
Jeff Thompson29ce3102013-09-27 11:47:48 -070054 signingCertificateName = identityManager_->getDefaultCertificateNameForIdentity(identityName);
55
56 if (signingCertificateName.getComponentCount() == 0)
57 throw SecurityException("No qualified certificate name found!");
58
59 if (!policyManager_->checkSigningPolicy(data.getName(), signingCertificateName))
Jeff Thompson9296f0c2013-09-23 18:10:27 -070060 throw SecurityException("Signing Cert name does not comply with signing policy");
Jeff Thompson29ce3102013-09-27 11:47:48 -070061
Jeff Thompson56e62652013-10-31 16:13:25 -070062 identityManager_->signByCertificate(data, signingCertificateName, wireFormat);
Jeff Thompson2ce8f492013-09-17 18:01:25 -070063}
64
Jeff Thompsone9ffe792013-10-22 10:58:48 -070065shared_ptr<Signature>
66KeyChain::signByIdentity(const uint8_t* buffer, size_t bufferLength, const Name& identityName)
67{
68 Name signingCertificateName = identityManager_->getDefaultCertificateNameForIdentity(identityName);
Jeff Thompsonc01e1782013-10-21 14:08:42 -070069
Jeff Thompsone9ffe792013-10-22 10:58:48 -070070 if (signingCertificateName.size() == 0)
71 throw SecurityException("No qualified certificate name found!");
Jeff Thompsonc01e1782013-10-21 14:08:42 -070072
Jeff Thompsone9ffe792013-10-22 10:58:48 -070073 return identityManager_->signByCertificate(buffer, bufferLength, signingCertificateName);
74}
Jeff Thompsonc01e1782013-10-21 14:08:42 -070075
Jeff Thompson2ce8f492013-09-17 18:01:25 -070076void
Jeff Thompson7c5d2312013-09-25 16:07:15 -070077KeyChain::verifyData
78 (const shared_ptr<Data>& data, const OnVerified& onVerified, const OnVerifyFailed& onVerifyFailed, int stepCount)
Jeff Thompson2ce8f492013-09-17 18:01:25 -070079{
Jeff Thompson2ce8f492013-09-17 18:01:25 -070080 _LOG_TRACE("Enter Verify");
Jeff Thompson2ce8f492013-09-17 18:01:25 -070081
Jeff Thompsonf309aa62013-10-31 17:03:54 -070082 if (policyManager_->requireVerify(*data)) {
83 shared_ptr<ValidationRequest> nextStep = policyManager_->checkVerificationPolicy
84 (data, stepCount, onVerified, onVerifyFailed);
Jeff Thompsoncda349e2013-11-05 17:37:39 -080085 if (nextStep)
86 face_->expressInterest
87 (*nextStep->interest_,
88 bind(&KeyChain::onCertificateData, this, _1, _2, nextStep),
89 bind(&KeyChain::onCertificateInterestTimeout, this, _1, nextStep->retry_, onVerifyFailed, data, nextStep));
Jeff Thompsonf309aa62013-10-31 17:03:54 -070090 }
91 else if (policyManager_->skipVerifyAndTrust(*data))
Jeff Thompson2ce8f492013-09-17 18:01:25 -070092 onVerified(data);
93 else
Jeff Thompson29ce3102013-09-27 11:47:48 -070094 onVerifyFailed(data);
Jeff Thompson1e90d8c2013-08-12 16:09:25 -070095}
96
Jeff Thompsoncda349e2013-11-05 17:37:39 -080097void
98KeyChain::onCertificateData(const shared_ptr<const Interest> &interest, const shared_ptr<Data> &data, shared_ptr<ValidationRequest> nextStep)
99{
100 // Try to verify the certificate (data) according to the parameters in nextStep.
101 verifyData(data, nextStep->onVerified_, nextStep->onVerifyFailed_, nextStep->stepCount_);
102}
103
104void
105KeyChain::onCertificateInterestTimeout
106 (const shared_ptr<const Interest> &interest, int retry, const OnVerifyFailed& onVerifyFailed, const shared_ptr<Data> &data,
107 shared_ptr<ValidationRequest> nextStep)
108{
109 if (retry > 0)
110 // Issue the same expressInterest as in verifyData except decrement retry.
111 face_->expressInterest
112 (*interest,
113 bind(&KeyChain::onCertificateData, this, _1, _2, nextStep),
114 bind(&KeyChain::onCertificateInterestTimeout, this, _1, retry - 1, onVerifyFailed, data, nextStep));
115 else
116 onVerifyFailed(data);
117}
118
Jeff Thompson47c93cf2013-08-09 00:38:48 -0700119}