Remove obsolete parts

Change-Id: I6794afc88f863ace988d2953bbd83bf277f4eb41
This commit is contained in:
Alexander Afanasyev committed 2018-03-11 10:53:55 -04:00
1 parent 40491df37b
commit a3aad847a5
7 files changed
+3 -1137

No files matched your search

-14
View File
@@ -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``
-2
View File
@@ -1,2 +0,0 @@
FAQ
===
+3 -23
View File
@@ -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.
-168
View File
@@ -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
-240
View File
@@ -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
-341
View File
@@ -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()