blob: a6c0cbe7c23d38485a225596c4a9bd9cd1acd564 [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Yingdi Yu8dceb1d2014-02-18 12:45:10 -08002/**
Alexander Afanasyev34a37632015-01-16 17:37:36 -08003 * Copyright (c) 2013-2015 Regents of the University of California.
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07006 *
Alexander Afanasyevc169a812014-05-20 20:37:29 -04007 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
Yingdi Yu8dceb1d2014-02-18 12:45:10 -080020 */
21
Yingdi Yu8dceb1d2014-02-18 12:45:10 -080022#include "security/key-chain.hpp"
Yingdi Yu1b0311c2015-06-10 14:58:47 -070023#include "security/validator.hpp"
Steve DiBenedettoa8659ff2014-12-04 14:50:28 -070024#include "../util/test-home-environment-fixture.hpp"
Yingdi Yuf56c68f2014-04-24 21:50:13 -070025#include <boost/filesystem.hpp>
Yingdi Yu8dceb1d2014-02-18 12:45:10 -080026
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070027#include "boost-test.hpp"
Alexander Afanasyev07113802015-01-15 19:14:36 -080028#include "dummy-keychain.hpp"
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070029
Yingdi Yu8dceb1d2014-02-18 12:45:10 -080030namespace ndn {
Yingdi Yu1b0311c2015-06-10 14:58:47 -070031namespace security {
Yingdi Yuf56c68f2014-04-24 21:50:13 -070032namespace tests {
Yingdi Yu8dceb1d2014-02-18 12:45:10 -080033
Spyridon Mastorakis429634f2015-02-19 17:35:33 -080034BOOST_FIXTURE_TEST_SUITE(SecurityKeyChain, util::TestHomeEnvironmentFixture)
Yingdi Yuf56c68f2014-04-24 21:50:13 -070035
36BOOST_AUTO_TEST_CASE(ConstructorNormalConfig)
37{
38 using namespace boost::filesystem;
39
Alexander Afanasyev8b1674a2014-05-15 00:58:43 -070040 setenv("TEST_HOME", "tests/unit-tests/security/config-file-home", 1);
Yingdi Yuf56c68f2014-04-24 21:50:13 -070041
42 BOOST_REQUIRE_NO_THROW(KeyChain());
43
Alexander Afanasyev07113802015-01-15 19:14:36 -080044 KeyChain keyChain;
45 BOOST_CHECK_EQUAL(keyChain.getPib().getPibLocator(),
46 "pib-sqlite3:/tmp/test/ndn-cxx/keychain/sqlite3-file/");
47 BOOST_CHECK_EQUAL(keyChain.getPib().getTpmLocator(),
48 "tpm-file:/tmp/test/ndn-cxx/keychain/sqlite3-file/");
49 BOOST_CHECK_EQUAL(keyChain.getTpm().getTpmLocator(),
50 "tpm-file:/tmp/test/ndn-cxx/keychain/sqlite3-file/");
51
Yingdi Yuf56c68f2014-04-24 21:50:13 -070052 path pibPath(absolute(std::getenv("TEST_HOME")));
53 pibPath /= ".ndn/ndnsec-public-info.db";
54
55 boost::filesystem::remove(pibPath);
56}
57
58BOOST_AUTO_TEST_CASE(ConstructorEmptyConfig)
59{
60 using namespace boost::filesystem;
61
Alexander Afanasyev8b1674a2014-05-15 00:58:43 -070062 setenv("TEST_HOME", "tests/unit-tests/security/config-file-empty-home", 1);
Yingdi Yuf56c68f2014-04-24 21:50:13 -070063
Yingdi Yu41546342014-11-30 23:37:53 -080064#if defined(NDN_CXX_HAVE_OSX_SECURITY)
65 std::string oldHOME;
66 if (std::getenv("OLD_HOME"))
67 oldHOME = std::getenv("OLD_HOME");
68
69 std::string HOME;
70 if (std::getenv("HOME"))
71 HOME = std::getenv("HOME");
72
73 if (!oldHOME.empty())
74 setenv("HOME", oldHOME.c_str(), 1);
75 else
76 unsetenv("HOME");
77#endif
78
79 BOOST_REQUIRE_NO_THROW(KeyChain());
Alexander Afanasyev07113802015-01-15 19:14:36 -080080 KeyChain keyChain;
81 BOOST_CHECK_EQUAL(keyChain.getPib().getPibLocator(),
82 "pib-sqlite3:/tmp/test/ndn-cxx/keychain/sqlite3-empty/");
83
84#if defined(NDN_CXX_HAVE_OSX_SECURITY)
85 BOOST_CHECK_EQUAL(keyChain.getPib().getTpmLocator(), "tpm-osxkeychain:");
86 BOOST_CHECK_EQUAL(keyChain.getTpm().getTpmLocator(), "tpm-osxkeychain:");
87#else
88 BOOST_CHECK_EQUAL(keyChain.getPib().getTpmLocator(),
89 "tpm-file:");
90 BOOST_CHECK_EQUAL(keyChain.getTpm().getTpmLocator(),
91 "tpm-file:");
92#endif
Yingdi Yu41546342014-11-30 23:37:53 -080093
94#if defined(NDN_CXX_HAVE_OSX_SECURITY)
95 if (!HOME.empty())
96 setenv("HOME", HOME.c_str(), 1);
97 else
98 unsetenv("HOME");
99#endif
100
101 path pibPath(absolute(std::getenv("TEST_HOME")));
102 pibPath /= ".ndn/ndnsec-public-info.db";
103
104 boost::filesystem::remove(pibPath);
105}
106
107BOOST_AUTO_TEST_CASE(ConstructorEmpty2Config)
108{
109 using namespace boost::filesystem;
110
111 setenv("TEST_HOME", "tests/unit-tests/security/config-file-empty2-home", 1);
112
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700113 BOOST_REQUIRE_NO_THROW(KeyChain());
114
Alexander Afanasyev07113802015-01-15 19:14:36 -0800115 KeyChain keyChain;
116 BOOST_CHECK_EQUAL(keyChain.getPib().getPibLocator(),
117 "pib-sqlite3:");
118 BOOST_CHECK_EQUAL(keyChain.getPib().getTpmLocator(),
119 "tpm-file:/tmp/test/ndn-cxx/keychain/empty-file/");
120 BOOST_CHECK_EQUAL(keyChain.getTpm().getTpmLocator(),
121 "tpm-file:/tmp/test/ndn-cxx/keychain/empty-file/");
122
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700123 path pibPath(absolute(std::getenv("TEST_HOME")));
124 pibPath /= ".ndn/ndnsec-public-info.db";
125
126 boost::filesystem::remove(pibPath);
127}
128
129BOOST_AUTO_TEST_CASE(ConstructorMalConfig)
130{
131 using namespace boost::filesystem;
132
Alexander Afanasyev8b1674a2014-05-15 00:58:43 -0700133 setenv("TEST_HOME", "tests/unit-tests/security/config-file-malformed-home", 1);
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700134
135 BOOST_REQUIRE_THROW(KeyChain(), KeyChain::Error); // Wrong configuration. Error expected.
136}
137
138BOOST_AUTO_TEST_CASE(ConstructorMal2Config)
139{
140 using namespace boost::filesystem;
141
Alexander Afanasyev8b1674a2014-05-15 00:58:43 -0700142 setenv("TEST_HOME", "tests/unit-tests/security/config-file-malformed2-home", 1);
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700143
144 BOOST_REQUIRE_THROW(KeyChain(), KeyChain::Error); // Wrong configuration. Error expected.
145}
146
147BOOST_AUTO_TEST_CASE(ExportIdentity)
148{
Yingdi Yu41546342014-11-30 23:37:53 -0800149 KeyChain keyChain;
Yingdi Yu8dceb1d2014-02-18 12:45:10 -0800150
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700151 Name identity("/TestKeyChain/ExportIdentity/");
152 identity.appendVersion();
Yingdi Yu8dceb1d2014-02-18 12:45:10 -0800153 keyChain.createIdentity(identity);
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700154
Yingdi Yu64c3fb42014-02-26 17:30:04 -0800155 shared_ptr<SecuredBag> exported = keyChain.exportIdentity(identity, "1234");
156
157 Block block = exported->wireEncode();
Yingdi Yu8dceb1d2014-02-18 12:45:10 -0800158
159 Name keyName = keyChain.getDefaultKeyNameForIdentity(identity);
160 Name certName = keyChain.getDefaultCertificateNameForKey(keyName);
161
162 keyChain.deleteIdentity(identity);
163
Yingdi Yu5ec0ee32014-06-24 16:26:09 -0700164 BOOST_CHECK_EQUAL(keyChain.doesIdentityExist(identity), false);
165 BOOST_CHECK_EQUAL(keyChain.doesPublicKeyExist(keyName), false);
166 BOOST_CHECK_EQUAL(keyChain.doesKeyExistInTpm(keyName, KEY_CLASS_PRIVATE), false);
167 BOOST_CHECK_EQUAL(keyChain.doesKeyExistInTpm(keyName, KEY_CLASS_PUBLIC), false);
168 BOOST_CHECK_EQUAL(keyChain.doesCertificateExist(certName), false);
Yingdi Yu8dceb1d2014-02-18 12:45:10 -0800169
Yingdi Yu64c3fb42014-02-26 17:30:04 -0800170 SecuredBag imported;
171 imported.wireDecode(block);
172 keyChain.importIdentity(imported, "1234");
Yingdi Yu8dceb1d2014-02-18 12:45:10 -0800173
Yingdi Yu5ec0ee32014-06-24 16:26:09 -0700174 BOOST_CHECK(keyChain.doesIdentityExist(identity));
175 BOOST_CHECK(keyChain.doesPublicKeyExist(keyName));
176 BOOST_CHECK(keyChain.doesKeyExistInTpm(keyName, KEY_CLASS_PRIVATE));
177 BOOST_CHECK(keyChain.doesKeyExistInTpm(keyName, KEY_CLASS_PUBLIC));
178 BOOST_CHECK(keyChain.doesCertificateExist(certName));
Yingdi Yu8dceb1d2014-02-18 12:45:10 -0800179
180 keyChain.deleteIdentity(identity);
181
Yingdi Yu5ec0ee32014-06-24 16:26:09 -0700182 BOOST_CHECK_EQUAL(keyChain.doesIdentityExist(identity), false);
183 BOOST_CHECK_EQUAL(keyChain.doesPublicKeyExist(keyName), false);
184 BOOST_CHECK_EQUAL(keyChain.doesKeyExistInTpm(keyName, KEY_CLASS_PRIVATE), false);
185 BOOST_CHECK_EQUAL(keyChain.doesKeyExistInTpm(keyName, KEY_CLASS_PUBLIC), false);
186 BOOST_CHECK_EQUAL(keyChain.doesCertificateExist(certName), false);
Yingdi Yu8dceb1d2014-02-18 12:45:10 -0800187}
188
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700189BOOST_AUTO_TEST_CASE(PrepareIdentityCertificate)
Yingdi Yuc55680b2014-02-26 12:31:35 -0800190{
Yingdi Yu41546342014-11-30 23:37:53 -0800191 KeyChain keyChain;
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700192
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700193 Name identity("/TestKeyChain/PrepareIdentityCertificate/");
194 identity.appendVersion();
Yingdi Yuc55680b2014-02-26 12:31:35 -0800195 keyChain.createIdentity(identity);
196
Junxiao Shi8ca43252015-06-11 21:29:43 -0700197 std::vector<CertificateSubjectDescription> subjectDescription;
Yingdi Yuc55680b2014-02-26 12:31:35 -0800198 Name lowerIdentity = identity;
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700199 lowerIdentity.append("Lower").appendVersion();
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700200 Name lowerKeyName = keyChain.generateRsaKeyPair(lowerIdentity, true);
Yingdi Yu5ec0ee32014-06-24 16:26:09 -0700201 shared_ptr<IdentityCertificate> idCert =
202 keyChain.prepareUnsignedIdentityCertificate(lowerKeyName, identity,
203 time::system_clock::now(),
204 time::system_clock::now() + time::days(365),
205 subjectDescription);
Yingdi Yuc55680b2014-02-26 12:31:35 -0800206 BOOST_CHECK(static_cast<bool>(idCert));
Yingdi Yu5ec0ee32014-06-24 16:26:09 -0700207 BOOST_CHECK_EQUAL(idCert->getName().getPrefix(5),
208 Name().append(identity).append("KEY").append("Lower"));
Junxiao Shi8ca43252015-06-11 21:29:43 -0700209 BOOST_CHECK(idCert->getFreshnessPeriod() >= time::milliseconds::zero());
Yingdi Yuc55680b2014-02-26 12:31:35 -0800210
Yingdi Yu0eb5d722014-06-10 15:06:25 -0700211 shared_ptr<IdentityCertificate> idCert11 =
212 keyChain.prepareUnsignedIdentityCertificate(lowerKeyName, identity,
213 time::system_clock::now(),
214 time::system_clock::now() + time::days(365),
215 subjectDescription,
216 lowerIdentity);
217 BOOST_CHECK(static_cast<bool>(idCert11));
Yingdi Yu5ec0ee32014-06-24 16:26:09 -0700218 BOOST_CHECK_EQUAL(idCert11->getName().getPrefix(6),
Yingdi Yu0eb5d722014-06-10 15:06:25 -0700219 Name().append(lowerIdentity).append("KEY"));
Yingdi Yuc55680b2014-02-26 12:31:35 -0800220
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700221 Name anotherIdentity("/TestKeyChain/PrepareIdentityCertificate/Another/");
222 anotherIdentity.appendVersion();
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700223 Name anotherKeyName = keyChain.generateRsaKeyPair(anotherIdentity, true);
Yingdi Yu5ec0ee32014-06-24 16:26:09 -0700224 shared_ptr<IdentityCertificate> idCert2 =
225 keyChain.prepareUnsignedIdentityCertificate(anotherKeyName, identity,
226 time::system_clock::now(),
227 time::system_clock::now() + time::days(365),
228 subjectDescription);
Yingdi Yuc55680b2014-02-26 12:31:35 -0800229 BOOST_CHECK(static_cast<bool>(idCert2));
Yingdi Yu5ec0ee32014-06-24 16:26:09 -0700230 BOOST_CHECK_EQUAL(idCert2->getName().getPrefix(5), Name().append(anotherIdentity).append("KEY"));
Yingdi Yuc55680b2014-02-26 12:31:35 -0800231
232
233 Name wrongKeyName1;
Yingdi Yu5ec0ee32014-06-24 16:26:09 -0700234 shared_ptr<IdentityCertificate> idCert3 =
235 keyChain.prepareUnsignedIdentityCertificate(wrongKeyName1, identity,
236 time::system_clock::now(),
237 time::system_clock::now() + time::days(365),
238 subjectDescription);
239 BOOST_CHECK_EQUAL(static_cast<bool>(idCert3), false);
Yingdi Yuc55680b2014-02-26 12:31:35 -0800240
241
242 Name wrongKeyName2("/TestKeyChain/PrepareIdentityCertificate");
Yingdi Yu5ec0ee32014-06-24 16:26:09 -0700243 shared_ptr<IdentityCertificate> idCert4 =
244 keyChain.prepareUnsignedIdentityCertificate(wrongKeyName2, identity,
245 time::system_clock::now(),
246 time::system_clock::now() + time::days(365),
247 subjectDescription);
248 BOOST_CHECK_EQUAL(static_cast<bool>(idCert4), false);
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700249
Yingdi Yuc55680b2014-02-26 12:31:35 -0800250
251 Name wrongKeyName3("/TestKeyChain/PrepareIdentityCertificate/ksk-1234");
Yingdi Yu5ec0ee32014-06-24 16:26:09 -0700252 shared_ptr<IdentityCertificate> idCert5 =
253 keyChain.prepareUnsignedIdentityCertificate(wrongKeyName3, identity,
254 time::system_clock::now(),
255 time::system_clock::now() + time::days(365),
256 subjectDescription);
257 BOOST_CHECK_EQUAL(static_cast<bool>(idCert5), false);
Yingdi Yuc55680b2014-02-26 12:31:35 -0800258
259 keyChain.deleteIdentity(identity);
260 keyChain.deleteIdentity(lowerIdentity);
261 keyChain.deleteIdentity(anotherIdentity);
262}
263
Yingdi Yu41546342014-11-30 23:37:53 -0800264BOOST_AUTO_TEST_CASE(Delete)
265{
266 KeyChain keyChain;
267
268 Name identity("/TestSecPublicInfoSqlite3/Delete");
269 identity.appendVersion();
270
271 Name certName1;
272 BOOST_REQUIRE_NO_THROW(certName1 = keyChain.createIdentity(identity));
273
274 Name keyName1 = IdentityCertificate::certificateNameToPublicKeyName(certName1);
275 Name keyName2;
276 BOOST_REQUIRE_NO_THROW(keyName2 = keyChain.generateRsaKeyPairAsDefault(identity));
277
278 shared_ptr<IdentityCertificate> cert2;
279 BOOST_REQUIRE_NO_THROW(cert2 = keyChain.selfSign(keyName2));
280 Name certName2 = cert2->getName();
281 BOOST_REQUIRE_NO_THROW(keyChain.addCertificateAsKeyDefault(*cert2));
282
283 Name keyName3;
284 BOOST_REQUIRE_NO_THROW(keyName3 = keyChain.generateRsaKeyPairAsDefault(identity));
285
286 shared_ptr<IdentityCertificate> cert3;
287 BOOST_REQUIRE_NO_THROW(cert3 = keyChain.selfSign(keyName3));
288 Name certName3 = cert3->getName();
289 BOOST_REQUIRE_NO_THROW(keyChain.addCertificateAsKeyDefault(*cert3));
290 shared_ptr<IdentityCertificate> cert4;
291 BOOST_REQUIRE_NO_THROW(cert4 = keyChain.selfSign(keyName3));
292 Name certName4 = cert4->getName();
293 BOOST_REQUIRE_NO_THROW(keyChain.addCertificateAsKeyDefault(*cert4));
294 shared_ptr<IdentityCertificate> cert5;
295 BOOST_REQUIRE_NO_THROW(cert5 = keyChain.selfSign(keyName3));
296 Name certName5 = cert5->getName();
297 BOOST_REQUIRE_NO_THROW(keyChain.addCertificateAsKeyDefault(*cert5));
298
299 BOOST_CHECK_EQUAL(keyChain.doesIdentityExist(identity), true);
300 BOOST_CHECK_EQUAL(keyChain.doesPublicKeyExist(keyName1), true);
301 BOOST_CHECK_EQUAL(keyChain.doesPublicKeyExist(keyName2), true);
302 BOOST_CHECK_EQUAL(keyChain.doesPublicKeyExist(keyName3), true);
303 BOOST_CHECK_EQUAL(keyChain.doesCertificateExist(certName1), true);
304 BOOST_CHECK_EQUAL(keyChain.doesCertificateExist(certName2), true);
305 BOOST_CHECK_EQUAL(keyChain.doesCertificateExist(certName3), true);
306 BOOST_CHECK_EQUAL(keyChain.doesCertificateExist(certName4), true);
307 BOOST_CHECK_EQUAL(keyChain.doesCertificateExist(certName5), true);
308
309 BOOST_REQUIRE_NO_THROW(keyChain.deleteCertificate(certName5));
310 BOOST_CHECK_EQUAL(keyChain.doesCertificateExist(certName5), false);
311 BOOST_CHECK_EQUAL(keyChain.doesCertificateExist(certName3), true);
312 BOOST_CHECK_EQUAL(keyChain.doesCertificateExist(certName4), true);
313 BOOST_CHECK_EQUAL(keyChain.doesPublicKeyExist(keyName3), true);
314
315 BOOST_REQUIRE_NO_THROW(keyChain.deleteKey(keyName3));
316 BOOST_CHECK_EQUAL(keyChain.doesCertificateExist(certName4), false);
317 BOOST_CHECK_EQUAL(keyChain.doesCertificateExist(certName3), false);
318 BOOST_CHECK_EQUAL(keyChain.doesPublicKeyExist(keyName3), false);
319 BOOST_CHECK_EQUAL(keyChain.doesPublicKeyExist(keyName2), true);
320 BOOST_CHECK_EQUAL(keyChain.doesPublicKeyExist(keyName1), true);
321 BOOST_CHECK_EQUAL(keyChain.doesIdentityExist(identity), true);
322
323 BOOST_REQUIRE_NO_THROW(keyChain.deleteIdentity(identity));
324 BOOST_CHECK_EQUAL(keyChain.doesCertificateExist(certName2), false);
325 BOOST_CHECK_EQUAL(keyChain.doesPublicKeyExist(keyName2), false);
326 BOOST_CHECK_EQUAL(keyChain.doesCertificateExist(certName1), false);
327 BOOST_CHECK_EQUAL(keyChain.doesPublicKeyExist(keyName1), false);
328 BOOST_CHECK_EQUAL(keyChain.doesIdentityExist(identity), false);
329}
330
Alexander Afanasyev07113802015-01-15 19:14:36 -0800331BOOST_AUTO_TEST_CASE(KeyChainWithCustomTpmAndPib)
332{
333 BOOST_REQUIRE_NO_THROW((KeyChain("pib-dummy", "tpm-dummy")));
Alexander Afanasyev34a37632015-01-16 17:37:36 -0800334 BOOST_REQUIRE_NO_THROW((KeyChain("pib-dummy2", "tpm-dummy2")));
Alexander Afanasyev07113802015-01-15 19:14:36 -0800335 BOOST_REQUIRE_NO_THROW((KeyChain("dummy", "dummy")));
336 BOOST_REQUIRE_NO_THROW((KeyChain("dummy:", "dummy:")));
337 BOOST_REQUIRE_NO_THROW((KeyChain("dummy:/something", "dummy:/something")));
338
339 KeyChain keyChain("dummy", "dummy");
Alexander Afanasyev34a37632015-01-16 17:37:36 -0800340 BOOST_CHECK_EQUAL(keyChain.getPib().getPibLocator(), "pib-dummy:");
341 BOOST_CHECK_EQUAL(keyChain.getPib().getTpmLocator(), "tpm-dummy:");
342 BOOST_CHECK_EQUAL(keyChain.getTpm().getTpmLocator(), "tpm-dummy:");
Alexander Afanasyev07113802015-01-15 19:14:36 -0800343 BOOST_CHECK_EQUAL(keyChain.getDefaultIdentity(), "/dummy/key");
344}
345
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700346BOOST_AUTO_TEST_CASE(GeneralSigningInterface)
347{
348 KeyChain keyChain;
349 Name id("/id");
350 Name certName = keyChain.createIdentity(id);
351 shared_ptr<IdentityCertificate> idCert = keyChain.getCertificate(certName);
352 Name keyName = idCert->getPublicKeyName();
353 keyChain.setDefaultIdentity(id);
354
355 Name id2("/id2");
356 Name cert2Name = keyChain.createIdentity(id2);
357 shared_ptr<IdentityCertificate> id2Cert = keyChain.getCertificate(cert2Name);
358
359 // SigningInfo is set to default
360 Data data1("/data1");
361 keyChain.sign(data1);
362 BOOST_CHECK(Validator::verifySignature(data1, idCert->getPublicKeyInfo()));
363 BOOST_CHECK_EQUAL(data1.getSignature().getKeyLocator().getName(), certName.getPrefix(-1));
364
365 Interest interest1("/interest1");
366 keyChain.sign(interest1);
367 BOOST_CHECK(Validator::verifySignature(interest1, idCert->getPublicKeyInfo()));
368 SignatureInfo sigInfo1(interest1.getName()[-2].blockFromValue());
369 BOOST_CHECK_EQUAL(sigInfo1.getKeyLocator().getName(), certName.getPrefix(-1));
370
371 // SigningInfo is set to Identity
372 Data data2("/data2");
373 keyChain.sign(data2, SigningInfo(SigningInfo::SIGNER_TYPE_ID, id2));
374 BOOST_CHECK(Validator::verifySignature(data2, id2Cert->getPublicKeyInfo()));
375 BOOST_CHECK_EQUAL(data2.getSignature().getKeyLocator().getName(), cert2Name.getPrefix(-1));
376
377 Interest interest2("/interest2");
378 keyChain.sign(interest2, SigningInfo(SigningInfo::SIGNER_TYPE_ID, id2));
379 BOOST_CHECK(Validator::verifySignature(interest2, id2Cert->getPublicKeyInfo()));
380 SignatureInfo sigInfo2(interest2.getName()[-2].blockFromValue());
381 BOOST_CHECK_EQUAL(sigInfo2.getKeyLocator().getName(), cert2Name.getPrefix(-1));
382
383 // SigningInfo is set to Key
384 Data data3("/data3");
385 keyChain.sign(data3, SigningInfo(SigningInfo::SIGNER_TYPE_KEY, keyName));
386 BOOST_CHECK(Validator::verifySignature(data3, idCert->getPublicKeyInfo()));
387 BOOST_CHECK_EQUAL(data3.getSignature().getKeyLocator().getName(), certName.getPrefix(-1));
388
389 Interest interest3("/interest3");
390 keyChain.sign(interest3);
391 BOOST_CHECK(Validator::verifySignature(interest3, idCert->getPublicKeyInfo()));
392 SignatureInfo sigInfo3(interest1.getName()[-2].blockFromValue());
393 BOOST_CHECK_EQUAL(sigInfo3.getKeyLocator().getName(), certName.getPrefix(-1));
394
395 // SigningInfo is set to Cert
396 Data data4("/data4");
397 keyChain.sign(data4, SigningInfo(SigningInfo::SIGNER_TYPE_CERT, certName));
398 BOOST_CHECK(Validator::verifySignature(data4, idCert->getPublicKeyInfo()));
399 BOOST_CHECK_EQUAL(data4.getSignature().getKeyLocator().getName(), certName.getPrefix(-1));
400
401 Interest interest4("/interest4");
402 keyChain.sign(interest4, SigningInfo(SigningInfo::SIGNER_TYPE_CERT, certName));
403 BOOST_CHECK(Validator::verifySignature(interest4, idCert->getPublicKeyInfo()));
404 SignatureInfo sigInfo4(interest4.getName()[-2].blockFromValue());
405 BOOST_CHECK_EQUAL(sigInfo4.getKeyLocator().getName(), certName.getPrefix(-1));
406
407
408 // SigningInfo is set to DigestSha256
409 Data data5("/data5");
410 keyChain.sign(data5, SigningInfo(SigningInfo::SIGNER_TYPE_SHA256));
411 BOOST_CHECK(Validator::verifySignature(data5, DigestSha256(data5.getSignature())));
412
413 Interest interest5("/interest4");
414 keyChain.sign(interest5, SigningInfo(SigningInfo::SIGNER_TYPE_SHA256));
415 BOOST_CHECK(Validator::verifySignature(interest5,
416 DigestSha256(Signature(interest5.getName()[-2].blockFromValue(),
417 interest5.getName()[-1].blockFromValue()))));
418}
419
Yingdi Yu8dceb1d2014-02-18 12:45:10 -0800420BOOST_AUTO_TEST_SUITE_END()
421
Yingdi Yuf56c68f2014-04-24 21:50:13 -0700422} // namespace tests
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700423} // namespace security
Yingdi Yu8dceb1d2014-02-18 12:45:10 -0800424} // namespace ndn