blob: 8d9717355a00f281917373f59e20f38e06b40bf2 [file] [log] [blame]
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
/**
* Copyright (C) 2013 Regents of the University of California.
* @author: Yingdi Yu <yingdi@cs.ucla.edu>
* See COPYING for copyright and distribution information.
*/
#if __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wtautological-compare"
#pragma clang diagnostic ignored "-Wunused-function"
#elif __GNUC__
#pragma GCC diagnostic ignored "-Wunused-function"
#endif
#include <boost/test/unit_test.hpp>
#include <boost/filesystem.hpp>
#include <ndn-cxx/security/key-chain.hpp>
#include <ndn-cxx/encoding/buffer-stream.hpp>
#include <ndn-cxx/util/time.hpp>
#include <ndn-cxx/util/io.hpp>
#include "cryptopp.hpp"
#include "endorse-certificate.hpp"
namespace chronochat {
namespace tests {
using std::vector;
using std::string;
using ndn::KeyChain;
using ndn::IdentityCertificate;
BOOST_AUTO_TEST_SUITE(TestEndorseCertificate)
const string testIdCert("\
Bv0DXwdRCBdFbmRvcnNlQ2VydGlmaWNhdGVUZXN0cwgDS0VZCAxFbmNvZGVEZWNv\
ZGUIEWtzay0xMzk0MDcyMTQ3MzM1CAdJRC1DRVJUCAf9AUSVLNXoFAMYAQIV/QG8\
MIIBuDAiGA8yMDE0MDMwNjAyMTU0N1oYDzIwMTQwMzEzMDkyNzQ3WjBuMA0GA1UE\
KRMGTXlOYW1lMBIGA1UECxMLTXlJbnN0aXR1dGUwDgYDVQQBEwdNeUdyb3VwMBEG\
A1UEAxMKTXlIb21lUGFnZTAQBgNVBFATCU15QWR2aXNvcjAUBgkqhkiG9w0BCQET\
B015RW1haWwwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQDYsWD0ixQF\
RfYs36BHNsRNv5ouEL69oaS6XX/hsQN1By4RNI6eSG5DpajtAwK1y+DXPwkLHd5S\
BrvwLzReF7SsrF2ObawznU14GKaQdbn+eVIER7CWvSpJhH5yKS4fCPRN+b1MP8QS\
DLvaaGu15T98cgVscIEqFkLfnWSQbdN6EnodjOH27JkBCz8Lxv9GZLrhfKGzOylR\
fLzvCIyIXYl6HWroO+xTJQaP+miSZNVGyf4jYqz5WbQH56a9ZjUldTphjuDbBjUq\
QaNVOzoKT+H4qh8mn399aQ9/BjM+6/WgrSw7/MO2UCgoZhySQY4HVqzUVVWnYwOU\
NYPoOS3HdvGLAgERFkEbAQEcPAc6CBdFbmRvcnNlQ2VydGlmaWNhdGVUZXN0cwgD\
S0VZCBFrc2stMTM5NDA3MjE0NzEyOAgHSUQtQ0VSVBf9AQARSwS/CelRRSUO4Tik\
5Q+L5zusaqq5652T92/83S5l38dO41BOf5fBUb3RtnFSbS/QaBCRfRJtDvkN2LhE\
vksJjSAoAKUzx27UyM1eq7L8DDvsvC9mbwxGzTK2F1t3Jy81rk5X34MecvztlILs\
nLqzqqiwl3dS1xyvg9GZez5g1yoOtRwzkHaah6svLVwzwM7kECXWRf4NoHTazWQo\
Cs6s60F9I/xBRKJ4Cw2L/AzvB5sX1J4HvHCsplbR/GdvA8uW6i8pp7kjIhjCGewK\
uNfH/4lHxzTl3pjsVy+EHKmwSlZ+T8cy5qaIEHxhbOzMNNVdit7XEwexOE66AVza\
92On");
const string testKey("\
MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEA2LFg9IsUBUX2LN+gRzbE\
Tb+aLhC+vaGkul1/4bEDdQcuETSOnkhuQ6Wo7QMCtcvg1z8JCx3eUga78C80Xhe0\
rKxdjm2sM51NeBimkHW5/nlSBEewlr0qSYR+cikuHwj0Tfm9TD/EEgy72mhrteU/\
fHIFbHCBKhZC351kkG3TehJ6HYzh9uyZAQs/C8b/RmS64XyhszspUXy87wiMiF2J\
eh1q6DvsUyUGj/pokmTVRsn+I2Ks+Vm0B+emvWY1JXU6YY7g2wY1KkGjVTs6Ck/h\
+KofJp9/fWkPfwYzPuv1oK0sO/zDtlAoKGYckkGOB1as1FVVp2MDlDWD6Dktx3bx\
iwIBEQ==");
const string testEndorseCert("\
Bv0DOgePCBdFbmRvcnNlQ2VydGlmaWNhdGVUZXN0cwgMRW5jb2RlRGVjb2RlCBFr\
c2stMTM5NDA3MjE0NzMzNQgMUFJPRklMRS1DRVJUCDwHOggXRW5kb3JzZUNlcnRp\
ZmljYXRlVGVzdHMIDEVuY29kZURlY29kZQgRa3NrLTEzOTQwNzIxNDczMzUIB/0B\
RJVWq1kUAxgBAhX9AnkwggJ1MCIYDzIwMTQwMzA2MDIxNTQ3WhgPMjAxNDAzMTMw\
OTI3NDdaMEAwPgYDVQQpEzcvRW5kb3JzZUNlcnRpZmljYXRlVGVzdHMvRW5jb2Rl\
RGVjb2RlL2tzay0xMzk0MDcyMTQ3MzM1MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0A\
MIIBCAKCAQEA2LFg9IsUBUX2LN+gRzbETb+aLhC+vaGkul1/4bEDdQcuETSOnkhu\
Q6Wo7QMCtcvg1z8JCx3eUga78C80Xhe0rKxdjm2sM51NeBimkHW5/nlSBEewlr0q\
SYR+cikuHwj0Tfm9TD/EEgy72mhrteU/fHIFbHCBKhZC351kkG3TehJ6HYzh9uyZ\
AQs/C8b/RmS64XyhszspUXy87wiMiF2Jeh1q6DvsUyUGj/pokmTVRsn+I2Ks+Vm0\
B+emvWY1JXU6YY7g2wY1KkGjVTs6Ck/h+KofJp9/fWkPfwYzPuv1oK0sO/zDtlAo\
KGYckkGOB1as1FVVp2MDlDWD6Dktx3bxiwIBETCB6DCBwAYHKwYBBSACAQEB/wSB\
sQoxCghJREVOVElUWRIlL0VuZG9yc2VDZXJ0aWZpY2F0ZVRlc3RzL0VuY29kZURl\
Y29kZQoUCgdhZHZpc29yEglNeUFkdmlzb3IKEAoFZW1haWwSB015RW1haWwKEAoF\
Z3JvdXASB015R3JvdXAKFgoIaG9tZXBhZ2USCk15SG9tZVBhZ2UKGgoLaW5zdGl0\
dXRpb24SC015SW5zdGl0dXRlCg4KBG5hbWUSBk15TmFtZTAjBgcrBgEFIAICAQH/\
BBUKBwoFZW1haWwKCgoIaG9tZXBhZ2UWAxsBABcgS7pYcBk1e4dlsag8minK+UzI\
L8ViVS87k09gaM6GeUA=");
BOOST_AUTO_TEST_CASE(IdCert)
{
boost::iostreams::stream<boost::iostreams::array_source> is(testIdCert.c_str(),
testIdCert.size());
shared_ptr<IdentityCertificate> idCert = ndn::io::load<IdentityCertificate>(is);
BOOST_CHECK(static_cast<bool>(idCert));
const ndn::Certificate::SubjectDescriptionList& subjectDescription =
idCert->getSubjectDescriptionList();
BOOST_CHECK_EQUAL(subjectDescription.size(), 6);
ndn::Certificate::SubjectDescriptionList::const_iterator it = subjectDescription.begin();
ndn::Certificate::SubjectDescriptionList::const_iterator end = subjectDescription.end();
int count = 0;
for(; it != end; it++)
{
if(it->getOidString() == "2.5.4.41")
{
BOOST_CHECK_EQUAL(it->getValue(), "MyName");
count++;
}
if(it->getOidString() == "2.5.4.11")
{
BOOST_CHECK_EQUAL(it->getValue(), "MyInstitute");
count++;
}
if(it->getOidString() == "2.5.4.1")
{
BOOST_CHECK_EQUAL(it->getValue(), "MyGroup");
count++;
}
if(it->getOidString() == "2.5.4.3")
{
BOOST_CHECK_EQUAL(it->getValue(), "MyHomePage");
count++;
}
if(it->getOidString() == "2.5.4.80")
{
BOOST_CHECK_EQUAL(it->getValue(), "MyAdvisor");
count++;
}
if(it->getOidString() == "1.2.840.113549.1.9.1")
{
BOOST_CHECK_EQUAL(it->getValue(), "MyEmail");
count++;
}
}
BOOST_CHECK_EQUAL(count, 6);
BOOST_CHECK_EQUAL(idCert->getName().toUri(),
"/EndorseCertificateTests/KEY/EncodeDecode/ksk-1394072147335/ID-CERT/%FD%01D%95%2C%D5%E8");
ndn::OBufferStream keyOs;
{
using namespace CryptoPP;
StringSource(testKey, true, new Base64Decoder(new FileSink(keyOs)));
}
ndn::PublicKey key(keyOs.buf()->buf(), keyOs.buf()->size());
BOOST_CHECK(key == idCert->getPublicKeyInfo());
}
BOOST_AUTO_TEST_CASE(ConstructFromIdCert)
{
boost::iostreams::stream<boost::iostreams::array_source> is(testIdCert.c_str(),
testIdCert.size());
shared_ptr<IdentityCertificate> idCert = ndn::io::load<IdentityCertificate>(is);
Profile profile(*idCert);
vector<string> endorseList;
endorseList.push_back("email");
endorseList.push_back("homepage");
EndorseCertificate endorseCertificate(*idCert, profile, endorseList);
boost::filesystem::path keyChainTmpPath =
boost::filesystem::path(TEST_CERT_PATH) / "TestEndorseCertificate";
KeyChain keyChain(std::string("sqlite3:").append(keyChainTmpPath.string()),
std::string("tpm-file:").append(keyChainTmpPath.string()));
keyChain.signWithSha256(endorseCertificate);
const Block& endorseDataBlock = endorseCertificate.wireEncode();
Data decodedEndorseData;
decodedEndorseData.wireDecode(endorseDataBlock);
EndorseCertificate decodedEndorse(decodedEndorseData);
BOOST_CHECK_EQUAL(decodedEndorse.getProfile().get("IDENTITY"),
"/EndorseCertificateTests/EncodeDecode");
BOOST_CHECK_EQUAL(decodedEndorse.getProfile().get("name"), "MyName");
BOOST_CHECK_EQUAL(decodedEndorse.getProfile().get("homepage"), "MyHomePage");
BOOST_CHECK_EQUAL(decodedEndorse.getEndorseList().size(), 2);
BOOST_CHECK_EQUAL(decodedEndorse.getEndorseList().at(0), "email");
BOOST_CHECK_EQUAL(decodedEndorse.getEndorseList().at(1), "homepage");
BOOST_CHECK_EQUAL(decodedEndorse.getSigner(),
"/EndorseCertificateTests/EncodeDecode/ksk-1394072147335");
BOOST_CHECK_EQUAL(decodedEndorse.getPublicKeyName(),
"/EndorseCertificateTests/EncodeDecode/ksk-1394072147335");
}
BOOST_AUTO_TEST_CASE(ConstructFromEndorseCert)
{
boost::iostreams::stream<boost::iostreams::array_source> is(testEndorseCert.c_str(),
testEndorseCert.size());
shared_ptr<Data> rawData = ndn::io::load<Data>(is);
EndorseCertificate rawEndorse(*rawData);
vector<string> endorseList;
endorseList.push_back("institution");
endorseList.push_back("group");
endorseList.push_back("advisor");
Name signer("/EndorseCertificateTests/Singer/ksk-1234567890");
EndorseCertificate endorseCertificate(rawEndorse, signer, endorseList);
boost::filesystem::path keyChainTmpPath =
boost::filesystem::path(TEST_CERT_PATH) / "TestEndorseCertificate";
KeyChain keyChain(std::string("sqlite3:").append(keyChainTmpPath.string()),
std::string("tpm-file:").append(keyChainTmpPath.string()));
keyChain.signWithSha256(endorseCertificate);
const Block& endorseDataBlock = endorseCertificate.wireEncode();
Data decodedEndorseData;
decodedEndorseData.wireDecode(endorseDataBlock);
EndorseCertificate decodedEndorse(decodedEndorseData);
BOOST_CHECK_EQUAL(decodedEndorse.getProfile().get("IDENTITY"),
"/EndorseCertificateTests/EncodeDecode");
BOOST_CHECK_EQUAL(decodedEndorse.getProfile().get("name"), "MyName");
BOOST_CHECK_EQUAL(decodedEndorse.getProfile().get("homepage"), "MyHomePage");
BOOST_CHECK_EQUAL(decodedEndorse.getEndorseList().size(), 3);
BOOST_CHECK_EQUAL(decodedEndorse.getEndorseList().at(0), "institution");
BOOST_CHECK_EQUAL(decodedEndorse.getEndorseList().at(1), "group");
BOOST_CHECK_EQUAL(decodedEndorse.getEndorseList().at(2), "advisor");
BOOST_CHECK_EQUAL(decodedEndorse.getSigner(),
"/EndorseCertificateTests/Singer/ksk-1234567890");
BOOST_CHECK_EQUAL(decodedEndorse.getPublicKeyName(),
"/EndorseCertificateTests/EncodeDecode/ksk-1394072147335");
}
BOOST_AUTO_TEST_SUITE_END()
} // namespace tests
} // namespace chronochat