Remove obsolete parts
Change-Id: I6794afc88f863ace988d2953bbd83bf277f4eb41
This commit is contained in:
1 parent
40491df37b
commit
a3aad847a5
7 files changed
+3
-1137
No files matched your search
@@ -1,14 +0,0 @@
|
||||
ChronoChat - A Serverless Chat Application in NDN
|
||||
=================================================
|
||||
|
||||
ChatRoom
|
||||
--------
|
||||
|
||||
The sync prefix of a chatroom is defined as: ``/ndn/broadcast/ChronoChat/[chatroom]``.
|
||||
|
||||
|
||||
..
|
||||
Invitation
|
||||
----------
|
||||
|
||||
Every application listen to a invitation prefix: ``/<routing_hint>/<user_prefix>/CHRONOCHAT-INVITATION``
|
||||
@@ -1,2 +0,0 @@
|
||||
FAQ
|
||||
===
|
||||
+3
-23
@@ -1,32 +1,14 @@
|
||||
ChronoSync - A synchronization Protocol in NDN
|
||||
==============================================
|
||||
|
||||
..
|
||||
NFD is a network forwarder that implements and evolves together with the Named Data
|
||||
Networking (NDN) `protocol <http://named-data.net/doc/ndn-tlv/>`__. After the initial
|
||||
release, NFD will become a core component of the `NDN Platform
|
||||
<http://named-data.net/codebase/platform/>`__ and will follow the same release cycle.
|
||||
|
||||
ChronoSync Documentation
|
||||
------------------------
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
:maxdepth: 3
|
||||
|
||||
DesignDoc
|
||||
FAQ
|
||||
ChronoChat
|
||||
|
||||
..
|
||||
INSTALL
|
||||
|
||||
* :doc:`DesignDoc`
|
||||
|
||||
* :doc:`FAQ`
|
||||
|
||||
* :doc:`ChronoChat`
|
||||
|
||||
**Additional documentation**
|
||||
|
||||
* `API documentation (doxygen) <doxygen/annotated.html>`_
|
||||
@@ -39,8 +21,6 @@ Downloading
|
||||
License
|
||||
-------
|
||||
|
||||
..
|
||||
NFD is an open and free software package licensed under GPL 3.0 license and is the
|
||||
centerpiece of our committement to making NDN's core technology open and free to all
|
||||
Internet users and developers. For more information about the licensing details and
|
||||
limitation, refer to `COPYING.md <https://github.com/named-data/NFD/blob/master/COPYING.md>`_.
|
||||
ChronoSync is free software: you can redistribute it and/or modify it under the terms
|
||||
of the GNU General Public License as published by the Free Software Foundation, either
|
||||
version 3 of the License, or (at your option) any later version.
|
||||
@@ -1,168 +0,0 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2012-2014 University of California, Los Angeles
|
||||
*
|
||||
* This file is part of ChronoSync, synchronization library for distributed realtime
|
||||
* applications for NDN.
|
||||
*
|
||||
* ChronoSync is free software: you can redistribute it and/or modify it under the terms
|
||||
* of the GNU General Public License as published by the Free Software Foundation, either
|
||||
* version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ChronoSync is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* ChronoSync, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* @author Yingdi Yu <http://irl.cs.ucla.edu/~yingdi/web/index.html>
|
||||
*/
|
||||
|
||||
#ifndef SYNC_INTRO_CERTIFICATE_H
|
||||
#define SYNC_INTRO_CERTIFICATE_H
|
||||
|
||||
#include <ndn-cxx/security/identity-certificate.hpp>
|
||||
#include <ndn-cxx/security/signature-sha256-with-rsa.hpp>
|
||||
|
||||
namespace Sync {
|
||||
|
||||
class IntroCertificate : public ndn::Data
|
||||
{
|
||||
/**
|
||||
* Naming convention of IntroCertificate:
|
||||
* /<sync_prefix>/CHRONOS-INTRO-CERT/introducee_certname/introducer_certname/version
|
||||
* Content: introducee's identity certificate;
|
||||
* KeyLocator: introducer's identity certificate;
|
||||
*/
|
||||
public:
|
||||
struct Error : public ndn::Data::Error { Error(const std::string &what) : ndn::Data::Error(what) {} };
|
||||
|
||||
IntroCertificate()
|
||||
{}
|
||||
|
||||
/**
|
||||
* @brief Construct IntroCertificate from IdentityCertificate
|
||||
*
|
||||
* @param syncPrefix
|
||||
* @param introduceeCert
|
||||
* @param introducerName
|
||||
*/
|
||||
IntroCertificate(const ndn::Name& syncPrefix,
|
||||
const ndn::IdentityCertificate& introduceeCert,
|
||||
const ndn::Name& introducerCertName); //without version number
|
||||
|
||||
/**
|
||||
* @brief Construct IntroCertificate using a plain data.
|
||||
*
|
||||
* if data is not actually IntroCertificate, Error will be thrown out.
|
||||
*
|
||||
* @param data
|
||||
* @throws ndn::IntroCertificate::Error.
|
||||
*/
|
||||
IntroCertificate(const ndn::Data& data);
|
||||
|
||||
virtual
|
||||
~IntroCertificate() {};
|
||||
|
||||
const ndn::IdentityCertificate&
|
||||
getIntroduceeCert() const
|
||||
{
|
||||
return m_introduceeCert;
|
||||
}
|
||||
|
||||
const ndn::Name&
|
||||
getIntroducerCertName() const
|
||||
{
|
||||
return m_introducerCertName;
|
||||
}
|
||||
|
||||
const ndn::Name&
|
||||
getIntroduceeCertName() const
|
||||
{
|
||||
return m_introduceeCertName;
|
||||
}
|
||||
|
||||
private:
|
||||
ndn::Name m_syncPrefix;
|
||||
ndn::IdentityCertificate m_introduceeCert;
|
||||
ndn::Name m_introducerCertName;
|
||||
ndn::Name m_introduceeCertName;
|
||||
};
|
||||
|
||||
inline
|
||||
IntroCertificate::IntroCertificate(const ndn::Name& syncPrefix,
|
||||
const ndn::IdentityCertificate& introduceeCert,
|
||||
const ndn::Name& introducerCertName)
|
||||
: m_syncPrefix(syncPrefix)
|
||||
, m_introduceeCert(introduceeCert)
|
||||
, m_introducerCertName(introducerCertName)
|
||||
, m_introduceeCertName(introduceeCert.getName().getPrefix(-1))
|
||||
{
|
||||
// Naming convention /<sync_prefix>/CHRONOS-INTRO-CERT/introducee_certname/introducer_certname/version
|
||||
ndn::Name dataName = m_syncPrefix;
|
||||
dataName.append("CHRONOS-INTRO-CERT")
|
||||
.append(m_introduceeCertName.wireEncode())
|
||||
.append(m_introducerCertName.wireEncode())
|
||||
.appendVersion();
|
||||
|
||||
setName(dataName);
|
||||
setContent(m_introduceeCert.wireEncode());
|
||||
}
|
||||
|
||||
inline
|
||||
IntroCertificate::IntroCertificate(const ndn::Data& data)
|
||||
: Data(data)
|
||||
{
|
||||
// Naming convention /<sync_prefix>/CHRONOS-INTRO-CERT/introducee_certname/introducer_certname/version
|
||||
ndn::Name dataName = data.getName();
|
||||
|
||||
if(dataName.size() < 4 || dataName.get(-4).toUri() != "CHRONOS-INTRO-CERT")
|
||||
throw Error("Not a Sync::IntroCertificate");
|
||||
|
||||
try
|
||||
{
|
||||
m_introduceeCert.wireDecode(data.getContent().blockFromValue());
|
||||
m_introducerCertName.wireDecode(dataName.get(-2).blockFromValue());
|
||||
m_introduceeCertName.wireDecode(dataName.get(-3).blockFromValue());
|
||||
m_syncPrefix = dataName.getPrefix(-4);
|
||||
}
|
||||
catch(ndn::IdentityCertificate::Error& e)
|
||||
{
|
||||
throw Error("Cannot decode introducee cert");
|
||||
}
|
||||
catch(ndn::Name::Error& e)
|
||||
{
|
||||
throw Error("Cannot decode name");
|
||||
}
|
||||
catch(ndn::Block::Error& e)
|
||||
{
|
||||
throw Error("Cannot decode block name");
|
||||
}
|
||||
|
||||
if(m_introduceeCertName != m_introduceeCert.getName().getPrefix(-1))
|
||||
throw Error("Invalid Sync::IntroCertificate (inconsistent introducee name)");
|
||||
|
||||
ndn::Name keyLocatorName;
|
||||
try
|
||||
{
|
||||
ndn::SignatureSha256WithRsa sig(data.getSignature());
|
||||
keyLocatorName = sig.getKeyLocator().getName();
|
||||
}
|
||||
catch(ndn::KeyLocator::Error& e)
|
||||
{
|
||||
throw Error("Invalid Sync::IntroCertificate (inconsistent introducer name#1)");
|
||||
}
|
||||
catch(ndn::SignatureSha256WithRsa::Error& e)
|
||||
{
|
||||
throw Error("Invalid Sync::IntroCertificate (inconsistent introducer name#2)");
|
||||
}
|
||||
|
||||
if(m_introducerCertName != keyLocatorName)
|
||||
throw Error("Invalid Sync::IntroCertificate (inconsistent introducer name#3)");
|
||||
}
|
||||
|
||||
|
||||
} // namespace Sync
|
||||
|
||||
#endif //SYNC_INTRO_CERTIFICATE_H
|
||||
@@ -1,240 +0,0 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2012-2014 University of California, Los Angeles
|
||||
*
|
||||
* This file is part of ChronoSync, synchronization library for distributed realtime
|
||||
* applications for NDN.
|
||||
*
|
||||
* ChronoSync is free software: you can redistribute it and/or modify it under the terms
|
||||
* of the GNU General Public License as published by the Free Software Foundation, either
|
||||
* version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ChronoSync is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* ChronoSync, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* @author Yingdi Yu <http://irl.cs.ucla.edu/~yingdi/web/index.html>
|
||||
*/
|
||||
|
||||
#include "sync-validator.h"
|
||||
#include "sync-logging.h"
|
||||
#include <ndn-cxx/security/certificate-cache-ttl.hpp>
|
||||
#include <queue>
|
||||
|
||||
using namespace ndn;
|
||||
|
||||
INIT_LOGGER ("SyncValidator")
|
||||
|
||||
namespace Sync {
|
||||
|
||||
using ndn::shared_ptr;
|
||||
|
||||
const shared_ptr<CertificateCache> SyncValidator::DefaultCertificateCache = shared_ptr<CertificateCache>();
|
||||
const shared_ptr<SecRuleRelative> SyncValidator::DefaultDataRule = shared_ptr<SecRuleRelative>();
|
||||
|
||||
SyncValidator::SyncValidator(const Name& prefix,
|
||||
const IdentityCertificate& anchor,
|
||||
Face& face,
|
||||
const PublishCertCallback& publishCertCallback,
|
||||
shared_ptr<SecRuleRelative> rule,
|
||||
shared_ptr<CertificateCache> certificateCache,
|
||||
const int stepLimit)
|
||||
: Validator(face)
|
||||
, m_prefix(prefix)
|
||||
, m_anchor(anchor)
|
||||
, m_stepLimit(stepLimit)
|
||||
, m_certificateCache(certificateCache)
|
||||
, m_publishCertCallback(publishCertCallback)
|
||||
, m_dataRule(rule)
|
||||
{
|
||||
if(!static_cast<bool>(m_certificateCache))
|
||||
m_certificateCache = make_shared<CertificateCacheTtl>(boost::ref(m_face.getIoService()));
|
||||
|
||||
Name certPrefix = prefix;
|
||||
certPrefix.append("CHRONOS-INTRO-CERT");
|
||||
m_prefixId = m_face.setInterestFilter(certPrefix,
|
||||
bind(&SyncValidator::onCertInterest, this, _1, _2),
|
||||
bind(&SyncValidator::onCertRegisterFailed, this, _1, _2));
|
||||
|
||||
setAnchor(m_anchor);
|
||||
}
|
||||
|
||||
void
|
||||
SyncValidator::deriveTrustNodes()
|
||||
{
|
||||
std::queue<Name> nodeQueue;
|
||||
|
||||
// Clear existing trust nodes.
|
||||
m_trustedNodes.clear();
|
||||
|
||||
// Add the trust anchor.
|
||||
IntroNode origin(m_anchor);
|
||||
m_trustedNodes[origin.name()] = m_anchor.getPublicKeyInfo();
|
||||
nodeQueue.push(origin.name());
|
||||
|
||||
// BFS trusted nodes.
|
||||
while(!nodeQueue.empty())
|
||||
{
|
||||
// Get next trusted node to process.
|
||||
Nodes::const_iterator it = m_introNodes.find(nodeQueue.front());
|
||||
const PublicKey& publicKey = m_trustedNodes[nodeQueue.front()];
|
||||
|
||||
if(it != m_introNodes.end())
|
||||
{
|
||||
// If the trusted node exists in the graph.
|
||||
IntroNode::const_iterator eeIt = it->second.introduceeBegin();
|
||||
IntroNode::const_iterator eeEnd = it->second.introduceeEnd();
|
||||
for(; eeIt != eeEnd; eeIt++)
|
||||
{
|
||||
// Check the nodes introduced by the trusted node.
|
||||
Edges::const_iterator edgeIt = m_introCerts.find(*eeIt);
|
||||
if(edgeIt != m_introCerts.end()
|
||||
&& m_trustedNodes.find(edgeIt->second.getIntroduceeCertName()) == m_trustedNodes.end()
|
||||
&& verifySignature(edgeIt->second, publicKey))
|
||||
{
|
||||
// If the introduced node can be validated, add it into trusted node set and the node queue.
|
||||
m_trustedNodes[edgeIt->second.getIntroduceeCertName()] = edgeIt->second.getIntroduceeCert().getPublicKeyInfo();
|
||||
nodeQueue.push(edgeIt->second.getIntroduceeCertName());
|
||||
}
|
||||
}
|
||||
}
|
||||
nodeQueue.pop();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
SyncValidator::checkPolicy (const Data& data,
|
||||
int stepCount,
|
||||
const OnDataValidated& onValidated,
|
||||
const OnDataValidationFailed& onValidationFailed,
|
||||
std::vector<shared_ptr<ValidationRequest> >& nextSteps)
|
||||
{
|
||||
if(m_stepLimit == stepCount)
|
||||
return onValidationFailed(data.shared_from_this(),
|
||||
"Maximum steps of validation reached: " + data.getName().toUri());
|
||||
|
||||
if(m_prefix.isPrefixOf(data.getName()) || (static_cast<bool>(m_dataRule) && m_dataRule->satisfy(data)))
|
||||
{
|
||||
try
|
||||
{
|
||||
SignatureSha256WithRsa sig(data.getSignature());
|
||||
Name keyLocatorName = sig.getKeyLocator().getName();
|
||||
|
||||
TrustNodes::const_iterator it = m_trustedNodes.find(keyLocatorName);
|
||||
if(m_trustedNodes.end() != it)
|
||||
{
|
||||
if(verifySignature(data, sig, it->second))
|
||||
return onValidated(data.shared_from_this());
|
||||
else
|
||||
return onValidationFailed(data.shared_from_this(),
|
||||
"Cannot verify signature: " + data.getName().toUri());
|
||||
}
|
||||
else
|
||||
{
|
||||
_LOG_DEBUG("I am: " << m_anchor.getName().get(0).toUri() << " for " << data.getName());
|
||||
|
||||
Name interestName = m_prefix;
|
||||
interestName.append("CHRONOS-INTRO-CERT").append(keyLocatorName.wireEncode());
|
||||
Interest interest(interestName);
|
||||
interest.setInterestLifetime(time::milliseconds(500));
|
||||
|
||||
OnDataValidated onKeyValidated = bind(&SyncValidator::onCertificateValidated, this,
|
||||
_1, data.shared_from_this(), onValidated, onValidationFailed);
|
||||
|
||||
OnDataValidationFailed onKeyValidationFailed = bind(&SyncValidator::onCertificateValidationFailed, this,
|
||||
_1, _2, data.shared_from_this(), onValidationFailed);
|
||||
|
||||
shared_ptr<ValidationRequest> nextStep = make_shared<ValidationRequest>(interest,
|
||||
onKeyValidated,
|
||||
onKeyValidationFailed,
|
||||
1,
|
||||
stepCount + 1);
|
||||
nextSteps.push_back(nextStep);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch(SignatureSha256WithRsa::Error& e)
|
||||
{
|
||||
return onValidationFailed(data.shared_from_this(),
|
||||
"Not SignatureSha256WithRsa signature: " + std::string(e.what()));
|
||||
}
|
||||
catch(KeyLocator::Error& e)
|
||||
{
|
||||
return onValidationFailed(data.shared_from_this(),
|
||||
"Key Locator is not a name: " + data.getName().toUri());
|
||||
}
|
||||
}
|
||||
else
|
||||
return onValidationFailed(data.shared_from_this(),
|
||||
"No rule or rule is not satisfied: " + data.getName().toUri());
|
||||
}
|
||||
|
||||
void
|
||||
SyncValidator::checkPolicy (const Interest& interest,
|
||||
int stepCount,
|
||||
const OnInterestValidated& onValidated,
|
||||
const OnInterestValidationFailed& onValidationFailed,
|
||||
std::vector<shared_ptr<ValidationRequest> >& nextSteps)
|
||||
{
|
||||
onValidationFailed(interest.shared_from_this(), "No policy for signed interest checking");
|
||||
}
|
||||
|
||||
void
|
||||
SyncValidator::onCertificateValidated(const shared_ptr<const Data>& signCertificate,
|
||||
const shared_ptr<const Data>& data,
|
||||
const OnDataValidated& onValidated,
|
||||
const OnDataValidationFailed& onValidationFailed)
|
||||
{
|
||||
try
|
||||
{
|
||||
IntroCertificate introCert(*signCertificate);
|
||||
addParticipant(introCert);
|
||||
|
||||
if(verifySignature(*data, introCert.getIntroduceeCert().getPublicKeyInfo()))
|
||||
return onValidated(data);
|
||||
else
|
||||
return onValidationFailed(data,
|
||||
"Cannot verify signature: " + data->getName().toUri());
|
||||
}
|
||||
catch(IntroCertificate::Error& e)
|
||||
{
|
||||
return onValidationFailed(data,
|
||||
"Intro cert decoding error: " + std::string(e.what()));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
SyncValidator::onCertificateValidationFailed(const shared_ptr<const Data>& signCertificate,
|
||||
const std::string& failureInfo,
|
||||
const shared_ptr<const Data>& data,
|
||||
const OnDataValidationFailed& onValidationFailed)
|
||||
{
|
||||
onValidationFailed(data, failureInfo);
|
||||
}
|
||||
|
||||
void
|
||||
SyncValidator::onCertInterest(const Name& prefix, const Interest& interest)
|
||||
{
|
||||
Name name = interest.getName();
|
||||
Edges::const_iterator it = m_introCerts.begin();
|
||||
for(; it != m_introCerts.end(); it++)
|
||||
{
|
||||
if(name.isPrefixOf(it->first))
|
||||
{
|
||||
m_face.put(it->second);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
SyncValidator::onCertRegisterFailed(const Name& prefix, const std::string& msg)
|
||||
{
|
||||
_LOG_DEBUG("SyncValidator::onCertRegisterFailed: " << msg);
|
||||
}
|
||||
|
||||
} // namespace Sync
|
||||
@@ -1,341 +0,0 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2012-2014 University of California, Los Angeles
|
||||
*
|
||||
* This file is part of ChronoSync, synchronization library for distributed realtime
|
||||
* applications for NDN.
|
||||
*
|
||||
* ChronoSync is free software: you can redistribute it and/or modify it under the terms
|
||||
* of the GNU General Public License as published by the Free Software Foundation, either
|
||||
* version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ChronoSync is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* ChronoSync, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* @author Yingdi Yu <http://irl.cs.ucla.edu/~yingdi/web/index.html>
|
||||
*/
|
||||
|
||||
#ifndef SYNC_VALIDATOR_H
|
||||
#define SYNC_VALIDATOR_H
|
||||
|
||||
#include "sync-intro-certificate.h"
|
||||
#include <ndn-cxx/security/validator.hpp>
|
||||
#include <ndn-cxx/security/key-chain.hpp>
|
||||
#include <ndn-cxx/security/sec-rule-relative.hpp>
|
||||
#include <ndn-cxx/security/certificate-cache.hpp>
|
||||
#include <map>
|
||||
|
||||
namespace Sync {
|
||||
|
||||
class SyncValidator : public ndn::Validator
|
||||
{
|
||||
public:
|
||||
typedef ndn::function< void (const uint8_t*, size_t, int) > PublishCertCallback;
|
||||
|
||||
struct Error : public ndn::Validator::Error { Error(const std::string &what) : ndn::Validator::Error(what) {} };
|
||||
|
||||
static const ndn::shared_ptr<ndn::CertificateCache> DefaultCertificateCache;
|
||||
static const ndn::shared_ptr<ndn::SecRuleRelative> DefaultDataRule;
|
||||
|
||||
SyncValidator(const ndn::Name& prefix,
|
||||
const ndn::IdentityCertificate& anchor,
|
||||
ndn::Face& face,
|
||||
const PublishCertCallback& publishCertCallback,
|
||||
ndn::shared_ptr<ndn::SecRuleRelative> rule = DefaultDataRule,
|
||||
ndn::shared_ptr<ndn::CertificateCache> certificateCache = DefaultCertificateCache,
|
||||
const int stepLimit = 10);
|
||||
|
||||
virtual
|
||||
~SyncValidator()
|
||||
{
|
||||
m_face.unsetInterestFilter(m_prefixId);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the trust anchor
|
||||
*
|
||||
* The anchor should be the participant's own certificate.
|
||||
* This anchor node is the origin of the derived trust graph.
|
||||
* Once the new anchor is set, derive the TrustNode set.
|
||||
*
|
||||
* @param anchor.
|
||||
*/
|
||||
inline void
|
||||
setAnchor(const ndn::IdentityCertificate& anchor);
|
||||
|
||||
/**
|
||||
* @brief Add a node into the trust graph.
|
||||
*
|
||||
* The method also create an edge from trust anchor to the node.
|
||||
*
|
||||
* @param introducee.
|
||||
* @return IntroCertificate for the introducee.
|
||||
*/
|
||||
inline ndn::shared_ptr<const IntroCertificate>
|
||||
addParticipant(const ndn::IdentityCertificate& introducee);
|
||||
|
||||
/**
|
||||
* @brief Add an edge into the trust graph.
|
||||
*
|
||||
* Create nodes if it is one of the edge's ends and does not exist in the graph.
|
||||
*
|
||||
* @param introCert.
|
||||
*/
|
||||
inline void
|
||||
addParticipant(const IntroCertificate& introCert);
|
||||
|
||||
inline void
|
||||
getIntroCertNames(std::vector<ndn::Name>& list);
|
||||
|
||||
inline const IntroCertificate&
|
||||
getIntroCertificate(const ndn::Name& name);
|
||||
|
||||
#ifdef _TEST
|
||||
bool
|
||||
canTrust(const ndn::Name& certName)
|
||||
{
|
||||
return (m_trustedNodes.find(certName.getPrefix(-1)) != m_trustedNodes.end());
|
||||
}
|
||||
#endif //_DEBUG
|
||||
|
||||
protected:
|
||||
/***********************
|
||||
* From ndn::Validator *
|
||||
***********************/
|
||||
virtual void
|
||||
checkPolicy (const ndn::Data& data,
|
||||
int stepCount,
|
||||
const ndn::OnDataValidated& onValidated,
|
||||
const ndn::OnDataValidationFailed& onValidationFailed,
|
||||
std::vector<ndn::shared_ptr<ndn::ValidationRequest> >& nextSteps);
|
||||
|
||||
virtual void
|
||||
checkPolicy (const ndn::Interest& interest,
|
||||
int stepCount,
|
||||
const ndn::OnInterestValidated& onValidated,
|
||||
const ndn::OnInterestValidationFailed& onValidationFailed,
|
||||
std::vector<ndn::shared_ptr<ndn::ValidationRequest> >& nextSteps);
|
||||
private:
|
||||
void
|
||||
deriveTrustNodes();
|
||||
|
||||
|
||||
void
|
||||
onCertificateValidated(const ndn::shared_ptr<const ndn::Data>& signCertificate,
|
||||
const ndn::shared_ptr<const ndn::Data>& data,
|
||||
const ndn::OnDataValidated& onValidated,
|
||||
const ndn::OnDataValidationFailed& onValidationFailed);
|
||||
|
||||
void
|
||||
onCertificateValidationFailed(const ndn::shared_ptr<const ndn::Data>& signCertificate,
|
||||
const std::string& failureInfo,
|
||||
const ndn::shared_ptr<const ndn::Data>& data,
|
||||
const ndn::OnDataValidationFailed& onValidationFailed);
|
||||
|
||||
void
|
||||
onCertInterest (const ndn::Name& prefix, const ndn::Interest& interest);
|
||||
|
||||
void
|
||||
onCertRegisterFailed(const ndn::Name& prefix, const std::string& msg);
|
||||
|
||||
private:
|
||||
class IntroNode;
|
||||
|
||||
// Syncprefix
|
||||
ndn::Name m_prefix;
|
||||
|
||||
// The map
|
||||
typedef std::map<const ndn::Name, IntroNode> Nodes;
|
||||
typedef std::map<const ndn::Name, IntroCertificate> Edges;
|
||||
Nodes m_introNodes;
|
||||
Edges m_introCerts;
|
||||
|
||||
// The derived trust info
|
||||
typedef std::map<const ndn::Name, ndn::PublicKey> TrustNodes;
|
||||
ndn::IdentityCertificate m_anchor;
|
||||
TrustNodes m_trustedNodes;
|
||||
|
||||
// others
|
||||
int m_stepLimit;
|
||||
ndn::shared_ptr<ndn::CertificateCache> m_certificateCache;
|
||||
ndn::KeyChain m_keychain;
|
||||
const ndn::RegisteredPrefixId* m_prefixId;
|
||||
PublishCertCallback m_publishCertCallback;
|
||||
ndn::shared_ptr<ndn::SecRuleRelative> m_dataRule;
|
||||
|
||||
class IntroNode
|
||||
{
|
||||
public:
|
||||
typedef std::vector<ndn::Name>::const_iterator const_iterator;
|
||||
|
||||
IntroNode()
|
||||
{}
|
||||
|
||||
IntroNode(const ndn::IdentityCertificate& idCert)
|
||||
: m_nodeName(idCert.getName().getPrefix(-1))
|
||||
{}
|
||||
|
||||
IntroNode(const IntroCertificate& introCert, bool isIntroducer)
|
||||
{
|
||||
if(isIntroducer)
|
||||
{
|
||||
m_nodeName = introCert.getIntroducerCertName();
|
||||
m_introduceeCerts.push_back(introCert.getName());
|
||||
}
|
||||
else
|
||||
{
|
||||
m_nodeName = introCert.getIntroduceeCertName();
|
||||
m_introducerCerts.push_back(introCert.getName());
|
||||
}
|
||||
}
|
||||
|
||||
~IntroNode()
|
||||
{}
|
||||
|
||||
const ndn::Name&
|
||||
name() const
|
||||
{
|
||||
return m_nodeName;
|
||||
}
|
||||
|
||||
const_iterator
|
||||
introducerBegin() const
|
||||
{
|
||||
return m_introducerCerts.begin();
|
||||
}
|
||||
|
||||
const_iterator
|
||||
introducerEnd() const
|
||||
{
|
||||
return m_introducerCerts.end();
|
||||
}
|
||||
|
||||
const_iterator
|
||||
introduceeBegin() const
|
||||
{
|
||||
return m_introduceeCerts.begin();
|
||||
}
|
||||
|
||||
const_iterator
|
||||
introduceeEnd() const
|
||||
{
|
||||
return m_introduceeCerts.end();
|
||||
}
|
||||
|
||||
void
|
||||
addIntroCertAsIntroducer(const ndn::Name& introCertName)
|
||||
{
|
||||
if(std::find(m_introduceeCerts.begin(), m_introduceeCerts.end(), introCertName) == m_introduceeCerts.end())
|
||||
m_introduceeCerts.push_back(introCertName);
|
||||
}
|
||||
|
||||
void
|
||||
addIntroCertAsIntroducee(const ndn::Name& introCertName)
|
||||
{
|
||||
if(std::find(m_introducerCerts.begin(), m_introducerCerts.end(), introCertName) == m_introducerCerts.end())
|
||||
m_introducerCerts.push_back(introCertName);
|
||||
}
|
||||
|
||||
private:
|
||||
ndn::Name m_nodeName;
|
||||
std::vector<ndn::Name> m_introducerCerts;
|
||||
std::vector<ndn::Name> m_introduceeCerts;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
inline void
|
||||
SyncValidator::setAnchor(const ndn::IdentityCertificate& anchor)
|
||||
{
|
||||
m_anchor = anchor;
|
||||
|
||||
// Add anchor into trust graph if it does not exist.
|
||||
IntroNode origin(m_anchor);
|
||||
Nodes::const_iterator nodeIt = m_introNodes.find(origin.name());
|
||||
if(nodeIt == m_introNodes.end())
|
||||
m_introNodes[origin.name()] = origin;
|
||||
|
||||
deriveTrustNodes();
|
||||
}
|
||||
|
||||
inline void
|
||||
SyncValidator::addParticipant(const IntroCertificate& introCert)
|
||||
{
|
||||
// Check if the edge has been added before.
|
||||
ndn::Name certName = introCert.getName();
|
||||
Edges::const_iterator edgeIt = m_introCerts.find(certName);
|
||||
if(edgeIt != m_introCerts.end())
|
||||
return; // the edge has been added before.
|
||||
|
||||
m_introCerts[certName] = introCert;
|
||||
|
||||
// Check if the introducer has been added.
|
||||
Nodes::iterator nodeIt = m_introNodes.find(introCert.getIntroducerCertName());
|
||||
if(nodeIt == m_introNodes.end())
|
||||
{
|
||||
IntroNode node(introCert, true);
|
||||
m_introNodes[node.name()] = node;
|
||||
}
|
||||
else
|
||||
nodeIt->second.addIntroCertAsIntroducer(certName);
|
||||
|
||||
// Check if the introducee has been added.
|
||||
nodeIt = m_introNodes.find(introCert.getIntroduceeCertName());
|
||||
if(nodeIt == m_introNodes.end())
|
||||
{
|
||||
IntroNode node(introCert, false);
|
||||
m_introNodes[node.name()] = node;
|
||||
}
|
||||
else
|
||||
nodeIt->second.addIntroCertAsIntroducee(certName);
|
||||
|
||||
// Check if the introducer is one of the trusted nodes.
|
||||
TrustNodes::const_iterator trustNodeIt = m_trustedNodes.find(introCert.getIntroducerCertName());
|
||||
if(trustNodeIt != m_trustedNodes.end() && verifySignature(introCert, trustNodeIt->second))
|
||||
// If the introducee, add it into trusted node set.
|
||||
m_trustedNodes[introCert.getIntroduceeCertName()] = introCert.getIntroduceeCert().getPublicKeyInfo();
|
||||
}
|
||||
|
||||
inline ndn::shared_ptr<const IntroCertificate>
|
||||
SyncValidator::addParticipant(const ndn::IdentityCertificate& introducee)
|
||||
{
|
||||
ndn::shared_ptr<IntroCertificate> introCert
|
||||
= ndn::shared_ptr<IntroCertificate>(new IntroCertificate(m_prefix, introducee, m_anchor.getName().getPrefix(-1)));
|
||||
|
||||
m_keychain.sign(*introCert, m_anchor.getName());
|
||||
|
||||
addParticipant(*introCert);
|
||||
|
||||
// Publish certificate as normal data.
|
||||
ndn::Block block = introCert->wireEncode();
|
||||
m_publishCertCallback(block.wire(), block.size(), 1000);
|
||||
|
||||
return introCert;
|
||||
}
|
||||
|
||||
inline void
|
||||
SyncValidator::getIntroCertNames(std::vector<ndn::Name>& list)
|
||||
{
|
||||
Edges::const_iterator it = m_introCerts.begin();
|
||||
Edges::const_iterator end = m_introCerts.end();
|
||||
for(; it != end; it++)
|
||||
list.push_back(it->first);
|
||||
}
|
||||
|
||||
inline const IntroCertificate&
|
||||
SyncValidator::getIntroCertificate(const ndn::Name& name)
|
||||
{
|
||||
Edges::const_iterator it = m_introCerts.find(name);
|
||||
if(it != m_introCerts.end())
|
||||
return it->second;
|
||||
else
|
||||
throw Error("No cert");
|
||||
}
|
||||
|
||||
} // namespace Sync
|
||||
|
||||
#endif //SYNC_VALIDATOR_H
|
||||
@@ -1,349 +0,0 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2012-2014 University of California, Los Angeles
|
||||
*
|
||||
* This file is part of ChronoSync, synchronization library for distributed realtime
|
||||
* applications for NDN.
|
||||
*
|
||||
* ChronoSync is free software: you can redistribute it and/or modify it under the terms
|
||||
* of the GNU General Public License as published by the Free Software Foundation, either
|
||||
* version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ChronoSync is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* ChronoSync, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
#include "sync-validator.h"
|
||||
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <boost/asio.hpp>
|
||||
#include <ndn-cxx/util/scheduler.hpp>
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(TestSyncValidator)
|
||||
|
||||
void
|
||||
onValidated(const ndn::shared_ptr<const ndn::Data>& data)
|
||||
{
|
||||
BOOST_CHECK(true);
|
||||
}
|
||||
|
||||
void
|
||||
onValidationFailed(const ndn::shared_ptr<const ndn::Data>& data,
|
||||
const std::string& failureInfo)
|
||||
{
|
||||
BOOST_CHECK(false);
|
||||
}
|
||||
|
||||
void
|
||||
onValidated2(const ndn::shared_ptr<const ndn::Data>& data)
|
||||
{
|
||||
BOOST_CHECK(false);
|
||||
}
|
||||
|
||||
void
|
||||
onValidationFailed2(const ndn::shared_ptr<const ndn::Data>& data,
|
||||
const std::string& failureInfo)
|
||||
{
|
||||
BOOST_CHECK(true);
|
||||
}
|
||||
|
||||
void
|
||||
publishData(const uint8_t* buf, size_t len, int freshness)
|
||||
{
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE (Graph)
|
||||
{
|
||||
using namespace Sync;
|
||||
using namespace ndn;
|
||||
|
||||
Name prefix("/Sync/TestSyncValidator/AddEdge");
|
||||
KeyChain keychain;
|
||||
|
||||
Name identity1("/TestSyncValidator/AddEdge-1/" + boost::lexical_cast<std::string>(ndn::time::toUnixTimestamp(ndn::time::system_clock::now()).count()));
|
||||
Name certName1 = keychain.createIdentity(identity1);
|
||||
shared_ptr<IdentityCertificate> anchor = keychain.getCertificate(certName1);
|
||||
|
||||
Name identity2("/TestSyncValidator/AddEdge-2/" + boost::lexical_cast<std::string>(ndn::time::toUnixTimestamp(ndn::time::system_clock::now()).count()));
|
||||
Name certName2 = keychain.createIdentity(identity2);
|
||||
shared_ptr<IdentityCertificate> introducer = keychain.getCertificate(certName2);
|
||||
|
||||
Name identity3("/TestSyncValidator/AddEdge-3/" + boost::lexical_cast<std::string>(ndn::time::toUnixTimestamp(ndn::time::system_clock::now()).count()));
|
||||
Name certName3 = keychain.createIdentity(identity3);
|
||||
shared_ptr<IdentityCertificate> introducee = keychain.getCertificate(certName3);
|
||||
|
||||
Name identity4("/TestSyncValidator/AddEdge-4/" + boost::lexical_cast<std::string>(ndn::time::toUnixTimestamp(ndn::time::system_clock::now()).count()));
|
||||
Name certName4 = keychain.createIdentity(identity4);
|
||||
shared_ptr<IdentityCertificate> introducer2 = keychain.getCertificate(certName4);
|
||||
|
||||
Name identity5("/TestSyncValidator/AddEdge-5/" + boost::lexical_cast<std::string>(ndn::time::toUnixTimestamp(ndn::time::system_clock::now()).count()));
|
||||
Name certName5 = keychain.createIdentity(identity5);
|
||||
shared_ptr<IdentityCertificate> introducee2 = keychain.getCertificate(certName5);
|
||||
|
||||
shared_ptr<boost::asio::io_service> ioService = make_shared<boost::asio::io_service>();
|
||||
shared_ptr<Face> face = make_shared<Face>(ref(*ioService));
|
||||
shared_ptr<SecRuleRelative> rule;
|
||||
SyncValidator validator(prefix, *anchor, *face,
|
||||
bind(&publishData, _1, _2, _3),
|
||||
rule);
|
||||
|
||||
validator.addParticipant(*introducer);
|
||||
BOOST_CHECK(validator.canTrust(certName2));
|
||||
|
||||
IntroCertificate introCert(prefix, *introducee, certName2.getPrefix(-1));
|
||||
keychain.sign(introCert, certName2);
|
||||
validator.addParticipant(introCert);
|
||||
BOOST_CHECK(validator.canTrust(certName3));
|
||||
|
||||
IntroCertificate introCert1(prefix, *anchor, certName3.getPrefix(-1));
|
||||
keychain.sign(introCert1, certName3);
|
||||
validator.addParticipant(introCert1);
|
||||
validator.setAnchor(*introducer);
|
||||
BOOST_CHECK(validator.canTrust(certName2));
|
||||
BOOST_CHECK(validator.canTrust(certName3));
|
||||
BOOST_CHECK(validator.canTrust(certName1));
|
||||
|
||||
IntroCertificate introCert2(prefix, *introducee2, certName4.getPrefix(-1));
|
||||
keychain.sign(introCert2, certName4);
|
||||
validator.addParticipant(introCert2);
|
||||
BOOST_CHECK(validator.canTrust(certName5) == false);
|
||||
BOOST_CHECK(validator.canTrust(certName4) == false);
|
||||
|
||||
IntroCertificate introCert3(prefix, *introducee, certName5.getPrefix(-1));
|
||||
keychain.sign(introCert3, certName5);
|
||||
validator.addParticipant(introCert3);
|
||||
BOOST_CHECK(validator.canTrust(certName5) == false);
|
||||
BOOST_CHECK(validator.canTrust(certName4) == false);
|
||||
|
||||
validator.setAnchor(*introducee2);
|
||||
BOOST_CHECK(validator.canTrust(certName1));
|
||||
BOOST_CHECK(validator.canTrust(certName2));
|
||||
BOOST_CHECK(validator.canTrust(certName3));
|
||||
BOOST_CHECK(validator.canTrust(certName4) == false);
|
||||
BOOST_CHECK(validator.canTrust(certName5));
|
||||
|
||||
|
||||
keychain.deleteIdentity(identity1);
|
||||
keychain.deleteIdentity(identity2);
|
||||
keychain.deleteIdentity(identity3);
|
||||
keychain.deleteIdentity(identity4);
|
||||
keychain.deleteIdentity(identity5);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE (OfflineValidate)
|
||||
{
|
||||
using namespace Sync;
|
||||
using namespace ndn;
|
||||
|
||||
Name prefix("/Sync/TestSyncValidator/OfflineValidate");
|
||||
KeyChain keychain;
|
||||
|
||||
Name identity1("/TestSyncValidator/OfflineValidate-1/"
|
||||
+ boost::lexical_cast<std::string>(ndn::time::toUnixTimestamp(ndn::time::system_clock::now()).count()));
|
||||
Name certName1 = keychain.createIdentity(identity1);
|
||||
shared_ptr<IdentityCertificate> anchor = keychain.getCertificate(certName1);
|
||||
|
||||
Name identity2("/TestSyncValidator/OfflineValidate-2/"
|
||||
+ boost::lexical_cast<std::string>(ndn::time::toUnixTimestamp(ndn::time::system_clock::now()).count()));
|
||||
Name certName2 = keychain.createIdentity(identity2);
|
||||
shared_ptr<IdentityCertificate> introducer = keychain.getCertificate(certName2);
|
||||
|
||||
Name identity3("/TestSyncValidator/OfflineValidate-3/"
|
||||
+ boost::lexical_cast<std::string>(ndn::time::toUnixTimestamp(ndn::time::system_clock::now()).count()));
|
||||
Name certName3 = keychain.createIdentity(identity3);
|
||||
shared_ptr<IdentityCertificate> introducee = keychain.getCertificate(certName3);
|
||||
|
||||
Name identity4("/TestSyncValidator/OfflineValidate-4/"
|
||||
+ boost::lexical_cast<std::string>(ndn::time::toUnixTimestamp(ndn::time::system_clock::now()).count()));
|
||||
Name certName4 = keychain.createIdentity(identity4);
|
||||
shared_ptr<IdentityCertificate> introducer2 = keychain.getCertificate(certName4);
|
||||
|
||||
Name identity5("/TestSyncValidator/OfflineValidate-5/"
|
||||
+ boost::lexical_cast<std::string>(ndn::time::toUnixTimestamp(ndn::time::system_clock::now()).count()));
|
||||
Name certName5 = keychain.createIdentity(identity5);
|
||||
shared_ptr<IdentityCertificate> introducee2 = keychain.getCertificate(certName5);
|
||||
|
||||
shared_ptr<boost::asio::io_service> ioService = make_shared<boost::asio::io_service>();
|
||||
shared_ptr<Face> face = make_shared<Face>(ref(*ioService));
|
||||
shared_ptr<SecRuleRelative> rule;
|
||||
SyncValidator validator(prefix, *anchor, *face,
|
||||
bind(&publishData, _1, _2, _3),
|
||||
rule);
|
||||
|
||||
validator.addParticipant(*introducer);
|
||||
BOOST_CHECK(validator.canTrust(certName2));
|
||||
|
||||
IntroCertificate introCert(prefix, *introducee, certName2.getPrefix(-1));
|
||||
keychain.sign(introCert, certName2);
|
||||
validator.addParticipant(introCert);
|
||||
BOOST_CHECK(validator.canTrust(certName3));
|
||||
|
||||
IntroCertificate introCert2(prefix, *introducee2, certName4.getPrefix(-1));
|
||||
keychain.sign(introCert2, certName4);
|
||||
validator.addParticipant(introCert2);
|
||||
BOOST_CHECK(validator.canTrust(certName5) == false);
|
||||
BOOST_CHECK(validator.canTrust(certName4) == false);
|
||||
|
||||
validator.setAnchor(*introducer2);
|
||||
BOOST_CHECK(validator.canTrust(certName1) == false);
|
||||
BOOST_CHECK(validator.canTrust(certName2) == false);
|
||||
BOOST_CHECK(validator.canTrust(certName3) == false);
|
||||
BOOST_CHECK(validator.canTrust(certName4));
|
||||
BOOST_CHECK(validator.canTrust(certName5));
|
||||
|
||||
Name dataName1 = prefix;
|
||||
dataName1.append("data-1");
|
||||
shared_ptr<Data> data1 = make_shared<Data>(dataName1);
|
||||
keychain.sign(*data1, certName5);
|
||||
|
||||
validator.validate(*data1,
|
||||
bind(&onValidated, _1),
|
||||
bind(&onValidationFailed, _1, _2));
|
||||
|
||||
Name dataName2 = prefix;
|
||||
dataName2.append("data-2");
|
||||
shared_ptr<Data> data2 = make_shared<Data>(dataName2);
|
||||
keychain.sign(*data2, certName1);
|
||||
|
||||
validator.validate(*data2,
|
||||
bind(&onValidated2, _1),
|
||||
bind(&onValidationFailed2, _1, _2));
|
||||
|
||||
// ioService->run();
|
||||
|
||||
keychain.deleteIdentity(identity1);
|
||||
keychain.deleteIdentity(identity2);
|
||||
keychain.deleteIdentity(identity3);
|
||||
keychain.deleteIdentity(identity4);
|
||||
keychain.deleteIdentity(identity5);
|
||||
}
|
||||
|
||||
struct FacesFixture
|
||||
{
|
||||
FacesFixture()
|
||||
: regPrefixId(0)
|
||||
, regPrefixId2(0)
|
||||
{}
|
||||
|
||||
void
|
||||
onInterest(ndn::shared_ptr<ndn::Face> face, ndn::shared_ptr<ndn::Data> data)
|
||||
{
|
||||
face->put(*data);
|
||||
face->unsetInterestFilter(regPrefixId);
|
||||
}
|
||||
|
||||
void
|
||||
onInterest2(ndn::shared_ptr<ndn::Face> face, ndn::shared_ptr<ndn::Data> data)
|
||||
{
|
||||
face->put(*data);
|
||||
face->unsetInterestFilter(regPrefixId2);
|
||||
}
|
||||
|
||||
void
|
||||
onRegFailed()
|
||||
{}
|
||||
|
||||
void
|
||||
validate(ndn::shared_ptr<Sync::SyncValidator> validator, ndn::shared_ptr<ndn::Data> data,
|
||||
const ndn::Name& certName3, const ndn::Name& certName4)
|
||||
{
|
||||
validator->validate(*data,
|
||||
bind(&onValidated, _1),
|
||||
bind(&onValidationFailed, _1, _2));
|
||||
|
||||
|
||||
BOOST_CHECK(validator->canTrust(certName3));
|
||||
BOOST_CHECK(validator->canTrust(certName4));
|
||||
}
|
||||
|
||||
void
|
||||
terminate(ndn::shared_ptr<ndn::Face> face)
|
||||
{
|
||||
face->getIoService().stop();
|
||||
}
|
||||
|
||||
const ndn::RegisteredPrefixId* regPrefixId;
|
||||
const ndn::RegisteredPrefixId* regPrefixId2;
|
||||
};
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(OnlineValidate, FacesFixture)
|
||||
{
|
||||
using namespace Sync;
|
||||
using namespace ndn;
|
||||
|
||||
Name prefix("/Sync/TestSyncValidator/OnlineValidate");
|
||||
KeyChain keychain;
|
||||
|
||||
Name identity1("/TestSyncValidator/OnlineValidate-1/"
|
||||
+ boost::lexical_cast<std::string>(ndn::time::toUnixTimestamp(ndn::time::system_clock::now()).count()));
|
||||
Name certName1 = keychain.createIdentity(identity1);
|
||||
shared_ptr<IdentityCertificate> anchor = keychain.getCertificate(certName1);
|
||||
|
||||
Name identity2("/TestSyncValidator/OnlineValidate-2/"
|
||||
+ boost::lexical_cast<std::string>(ndn::time::toUnixTimestamp(ndn::time::system_clock::now()).count()));
|
||||
Name certName2 = keychain.createIdentity(identity2);
|
||||
shared_ptr<IdentityCertificate> introducer = keychain.getCertificate(certName2);
|
||||
|
||||
Name identity3("/TestSyncValidator/OnlineValidate-3/"
|
||||
+ boost::lexical_cast<std::string>(ndn::time::toUnixTimestamp(ndn::time::system_clock::now()).count()));
|
||||
Name certName3 = keychain.createIdentity(identity3);
|
||||
shared_ptr<IdentityCertificate> introducee = keychain.getCertificate(certName3);
|
||||
|
||||
Name identity4("/TestSyncValidator/OnlineValidate-4/"
|
||||
+ boost::lexical_cast<std::string>(ndn::time::toUnixTimestamp(ndn::time::system_clock::now()).count()));
|
||||
Name certName4 = keychain.createIdentity(identity4);
|
||||
shared_ptr<IdentityCertificate> introducee2 = keychain.getCertificate(certName4);
|
||||
|
||||
shared_ptr<boost::asio::io_service> ioService = make_shared<boost::asio::io_service>();
|
||||
shared_ptr<Face> face = make_shared<Face>(ref(*ioService));
|
||||
shared_ptr<Face> face2 = make_shared<Face>(ref(*ioService));
|
||||
|
||||
shared_ptr<SecRuleRelative> rule;
|
||||
shared_ptr<SyncValidator> validator = shared_ptr<SyncValidator>
|
||||
(new SyncValidator(prefix, *anchor, *face2, bind(&publishData, _1, _2, _3), rule));
|
||||
|
||||
validator->addParticipant(*introducer);
|
||||
BOOST_CHECK(validator->canTrust(certName2));
|
||||
|
||||
shared_ptr<IntroCertificate> introCert = shared_ptr<IntroCertificate>(new IntroCertificate(prefix, *introducee, certName2.getPrefix(-1)));
|
||||
keychain.sign(*introCert, certName2);
|
||||
BOOST_CHECK(validator->canTrust(certName3) == false);
|
||||
|
||||
shared_ptr<IntroCertificate> introCert2 = shared_ptr<IntroCertificate>(new IntroCertificate(prefix, *introducee2, certName3.getPrefix(-1)));
|
||||
keychain.sign(*introCert2, certName3);
|
||||
BOOST_CHECK(validator->canTrust(certName4) == false);
|
||||
|
||||
Name dataName1 = prefix;
|
||||
dataName1.append("data-1");
|
||||
shared_ptr<Data> data1 = make_shared<Data>(dataName1);
|
||||
keychain.sign(*data1, certName4);
|
||||
|
||||
ndn::Scheduler scheduler(*ioService);
|
||||
|
||||
scheduler.scheduleEvent(time::seconds(1),
|
||||
bind(&FacesFixture::terminate, this, face));
|
||||
|
||||
regPrefixId = face->setInterestFilter(introCert->getName().getPrefix(-1),
|
||||
bind(&FacesFixture::onInterest, this, face, introCert),
|
||||
bind(&FacesFixture::onRegFailed, this));
|
||||
|
||||
regPrefixId2 = face->setInterestFilter(introCert2->getName().getPrefix(-1),
|
||||
bind(&FacesFixture::onInterest2, this, face, introCert2),
|
||||
bind(&FacesFixture::onRegFailed, this));
|
||||
|
||||
scheduler.scheduleEvent(time::milliseconds(200),
|
||||
bind(&FacesFixture::validate, this,
|
||||
validator, data1, certName3, certName4));
|
||||
|
||||
keychain.deleteIdentity(identity1);
|
||||
keychain.deleteIdentity(identity2);
|
||||
keychain.deleteIdentity(identity3);
|
||||
keychain.deleteIdentity(identity4);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
Reference in new issue
Block a user