blob: ccf54dfb12725200e7d0c84a91bcfcb8da1bf38f [file] [log] [blame]
Yingdi Yu3bf91f52015-06-12 19:39:40 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Yingdi Yu6ee2d362015-07-16 21:48:05 -07003 * Copyright (c) 2013-2017 Regents of the University of California.
Yingdi Yu3bf91f52015-06-12 19:39:40 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6 *
7 * 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.
20 */
21
Alexander Afanasyev97709c02016-08-25 19:58:30 -070022#include "security/pib/pib-memory.hpp"
23#include "security/pib/pib-sqlite3.hpp"
24#include "security/pib/pib.hpp"
Yingdi Yu6ee2d362015-07-16 21:48:05 -070025#include "security/security-common.hpp"
Davide Pesaventoeee3e822016-11-26 19:19:34 +010026
27#include "boost-test.hpp"
Yingdi Yu3bf91f52015-06-12 19:39:40 -070028#include "pib-data-fixture.hpp"
29
Mickey Sweatt11314b72015-06-10 17:20:19 -070030#include <boost/filesystem.hpp>
Yingdi Yu3bf91f52015-06-12 19:39:40 -070031#include <boost/mpl/list.hpp>
Yingdi Yu3bf91f52015-06-12 19:39:40 -070032
33namespace ndn {
34namespace security {
Yingdi Yu6ee2d362015-07-16 21:48:05 -070035namespace pib {
Yingdi Yu3bf91f52015-06-12 19:39:40 -070036namespace tests {
37
Yingdi Yu6ee2d362015-07-16 21:48:05 -070038using namespace ndn::security::tests;
39
Davide Pesaventoeee3e822016-11-26 19:19:34 +010040BOOST_AUTO_TEST_SUITE(Security)
Yingdi Yu6ee2d362015-07-16 21:48:05 -070041BOOST_AUTO_TEST_SUITE(Pib)
Davide Pesaventoeee3e822016-11-26 19:19:34 +010042BOOST_AUTO_TEST_SUITE(TestPibImpl)
Yingdi Yu3bf91f52015-06-12 19:39:40 -070043
Yingdi Yu6ee2d362015-07-16 21:48:05 -070044using pib::Pib;
45
Mickey Sweatt11314b72015-06-10 17:20:19 -070046class PibMemoryWrapper
47{
48public:
49 PibMemory impl;
50};
51
52class PibSqlite3Wrapper
53{
54public:
55 PibSqlite3Wrapper()
56 : tmpPath(boost::filesystem::path(UNIT_TEST_CONFIG_PATH) / "DbTest")
57 , impl(tmpPath.c_str())
58 {
59 }
60
61 ~PibSqlite3Wrapper()
62 {
63 boost::filesystem::remove_all(tmpPath);
64 }
65
Davide Pesaventoeee3e822016-11-26 19:19:34 +010066public:
Mickey Sweatt11314b72015-06-10 17:20:19 -070067 boost::filesystem::path tmpPath;
68 PibSqlite3 impl;
69};
70
71typedef boost::mpl::list<PibMemoryWrapper,
72 PibSqlite3Wrapper> PibImpls;
Yingdi Yu3bf91f52015-06-12 19:39:40 -070073
74BOOST_FIXTURE_TEST_CASE_TEMPLATE(IdentityManagement, T, PibImpls, PibDataFixture)
75{
Mickey Sweatt11314b72015-06-10 17:20:19 -070076 T wrapper;
77 PibImpl& pibImpl = wrapper.impl;
Yingdi Yu3bf91f52015-06-12 19:39:40 -070078
79 // no default setting, throw Error
80 BOOST_CHECK_THROW(pibImpl.getDefaultIdentity(), Pib::Error);
81
82 // check id1, which should not exist
83 BOOST_CHECK_EQUAL(pibImpl.hasIdentity(id1), false);
84
85 // add id1, should be default
86 pibImpl.addIdentity(id1);
87 BOOST_CHECK_EQUAL(pibImpl.hasIdentity(id1), true);
88 BOOST_CHECK_NO_THROW(pibImpl.getDefaultIdentity());
89 BOOST_CHECK_EQUAL(pibImpl.getDefaultIdentity(), id1);
90
91 // add id2, should not be default
92 pibImpl.addIdentity(id2);
93 BOOST_CHECK_EQUAL(pibImpl.hasIdentity(id2), true);
94 BOOST_CHECK_EQUAL(pibImpl.getDefaultIdentity(), id1);
95
96 // set id2 explicitly as default
97 pibImpl.setDefaultIdentity(id2);
98 BOOST_CHECK_EQUAL(pibImpl.getDefaultIdentity(), id2);
99
100 // remove id2, should not have default identity
101 pibImpl.removeIdentity(id2);
102 BOOST_CHECK_EQUAL(pibImpl.hasIdentity(id2), false);
103 BOOST_CHECK_THROW(pibImpl.getDefaultIdentity(), Pib::Error);
104
105 // add id2 again, should be default
106 pibImpl.addIdentity(id2);
107 BOOST_CHECK_EQUAL(pibImpl.getDefaultIdentity(), id2);
108
109 // get all identities, should contain id1 and id2
110 std::set<Name> idNames = pibImpl.getIdentities();
111 BOOST_CHECK_EQUAL(idNames.size(), 2);
112 BOOST_CHECK_EQUAL(idNames.count(id1), 1);
113 BOOST_CHECK_EQUAL(idNames.count(id2), 1);
114}
115
116BOOST_FIXTURE_TEST_CASE_TEMPLATE(KeyManagement, T, PibImpls, PibDataFixture)
117{
Mickey Sweatt11314b72015-06-10 17:20:19 -0700118 T wrapper;
119 PibImpl& pibImpl = wrapper.impl;
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700120
121 // no default setting, throw Error
122 BOOST_CHECK_THROW(pibImpl.getDefaultKeyOfIdentity(id1), Pib::Error);
123
124 // check id1Key1, should not exist, neither should id1.
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700125 BOOST_CHECK_EQUAL(pibImpl.hasKey(id1Key1Name), false);
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700126 BOOST_CHECK_EQUAL(pibImpl.hasIdentity(id1), false);
127
128 // add id1Key1, should be default, id1 should be added implicitly
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700129 pibImpl.addKey(id1, id1Key1Name, id1Key1.buf(), id1Key1.size());
130 BOOST_CHECK_EQUAL(pibImpl.hasKey(id1Key1Name), true);
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700131 BOOST_CHECK_EQUAL(pibImpl.hasIdentity(id1), true);
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700132 const Buffer& keyBits = pibImpl.getKeyBits(id1Key1Name);
133 BOOST_CHECK_EQUAL_COLLECTIONS(keyBits.begin(), keyBits.end(), id1Key1.begin(), id1Key1.end());
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700134 BOOST_CHECK_NO_THROW(pibImpl.getDefaultKeyOfIdentity(id1));
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700135 BOOST_CHECK_EQUAL(pibImpl.getDefaultKeyOfIdentity(id1), id1Key1Name);
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700136
137 // add id1Key2, should not be default
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700138 pibImpl.addKey(id1, id1Key2Name, id1Key2.buf(), id1Key2.size());
139 BOOST_CHECK_EQUAL(pibImpl.hasKey(id1Key2Name), true);
140 BOOST_CHECK_EQUAL(pibImpl.getDefaultKeyOfIdentity(id1), id1Key1Name);
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700141
142 // set id1Key2 explicitly as default
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700143 pibImpl.setDefaultKeyOfIdentity(id1, id1Key2Name);
144 BOOST_CHECK_EQUAL(pibImpl.getDefaultKeyOfIdentity(id1), id1Key2Name);
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700145
146 // set a non-existing key as default, throw Error
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700147 BOOST_CHECK_THROW(pibImpl.setDefaultKeyOfIdentity(id1, Name("/non-existing")),
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700148 Pib::Error);
149
150 // remove id1Key2, should not have default key
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700151 pibImpl.removeKey(id1Key2Name);
152 BOOST_CHECK_EQUAL(pibImpl.hasKey(id1Key2Name), false);
153 BOOST_CHECK_THROW(pibImpl.getKeyBits(id1Key2Name), Pib::Error);
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700154 BOOST_CHECK_THROW(pibImpl.getDefaultKeyOfIdentity(id1), Pib::Error);
155
156 // add id1Key2 back, should be default
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700157 pibImpl.addKey(id1, id1Key2Name, id1Key2.buf(), id1Key2.size());
158 BOOST_CHECK_NO_THROW(pibImpl.getKeyBits(id1Key2Name));
159 BOOST_CHECK_EQUAL(pibImpl.getDefaultKeyOfIdentity(id1), id1Key2Name);
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700160
161 // get all the keys: id1Key1 and id1Key2
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700162 std::set<Name> keyNames = pibImpl.getKeysOfIdentity(id1);
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700163 BOOST_CHECK_EQUAL(keyNames.size(), 2);
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700164 BOOST_CHECK_EQUAL(keyNames.count(id1Key1Name), 1);
165 BOOST_CHECK_EQUAL(keyNames.count(id1Key2Name), 1);
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700166
167 // remove id1, should remove all the keys
168 pibImpl.removeIdentity(id1);
169 keyNames = pibImpl.getKeysOfIdentity(id1);
170 BOOST_CHECK_EQUAL(keyNames.size(), 0);
171}
172
173BOOST_FIXTURE_TEST_CASE_TEMPLATE(CertificateManagement, T, PibImpls, PibDataFixture)
174{
Mickey Sweatt11314b72015-06-10 17:20:19 -0700175 T wrapper;
176 PibImpl& pibImpl = wrapper.impl;
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700177
178 // no default setting, throw Error
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700179 BOOST_CHECK_THROW(pibImpl.getDefaultCertificateOfKey(id1Key1Name), Pib::Error);
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700180
181 // check id1Key1Cert1, should not exist, neither should id1 and id1Key1
182 BOOST_CHECK_EQUAL(pibImpl.hasCertificate(id1Key1Cert1.getName()), false);
183 BOOST_CHECK_EQUAL(pibImpl.hasIdentity(id1), false);
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700184 BOOST_CHECK_EQUAL(pibImpl.hasKey(id1Key1Name), false);
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700185
186 // add id1Key1Cert1, should be default, id1 and id1Key1 should be added implicitly
187 pibImpl.addCertificate(id1Key1Cert1);
188 BOOST_CHECK_EQUAL(pibImpl.hasCertificate(id1Key1Cert1.getName()), true);
189 BOOST_CHECK_EQUAL(pibImpl.hasIdentity(id1), true);
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700190 BOOST_CHECK_EQUAL(pibImpl.hasKey(id1Key1Name), true);
191 const auto& cert = pibImpl.getCertificate(id1Key1Cert1.getName());
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700192 BOOST_CHECK_EQUAL_COLLECTIONS(cert.wireEncode().wire(),
193 cert.wireEncode().wire() + cert.wireEncode().size(),
194 id1Key1Cert1.wireEncode().wire(),
195 id1Key1Cert1.wireEncode().wire() + id1Key1Cert1.wireEncode().size());
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700196 BOOST_CHECK_NO_THROW(pibImpl.getDefaultCertificateOfKey(id1Key1Name));
197 BOOST_CHECK_EQUAL(pibImpl.getDefaultCertificateOfKey(id1Key1Name), id1Key1Cert1);
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700198
199 // add id1Key1Cert2, should not be default
200 pibImpl.addCertificate(id1Key1Cert2);
201 BOOST_CHECK_EQUAL(pibImpl.hasCertificate(id1Key1Cert2.getName()), true);
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700202 BOOST_CHECK_EQUAL(pibImpl.getDefaultCertificateOfKey(id1Key1Name), id1Key1Cert1);
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700203
204 // set id1Key1Cert2 explicitly as default
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700205 pibImpl.setDefaultCertificateOfKey(id1Key1Name, id1Key1Cert2.getName());
206 BOOST_CHECK_EQUAL(pibImpl.getDefaultCertificateOfKey(id1Key1Name), id1Key1Cert2);
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700207
208 // set a non-existing cert as default, throw Error
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700209 BOOST_CHECK_THROW(pibImpl.setDefaultCertificateOfKey(id1Key1Name, Name("/non-existing")),
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700210 Pib::Error);
211
212 // remove id1Key1Cert2, should not have default cert
213 pibImpl.removeCertificate(id1Key1Cert2.getName());
214 BOOST_CHECK_EQUAL(pibImpl.hasCertificate(id1Key1Cert2.getName()), false);
215 BOOST_CHECK_THROW(pibImpl.getCertificate(id1Key1Cert2.getName()), Pib::Error);
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700216 BOOST_CHECK_THROW(pibImpl.getDefaultCertificateOfKey(id1Key1Name), Pib::Error);
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700217
218 // add id1Key1Cert2, should be default
219 pibImpl.addCertificate(id1Key1Cert2);
220 BOOST_CHECK_NO_THROW(pibImpl.getCertificate(id1Key1Cert1.getName()));
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700221 BOOST_CHECK_EQUAL(pibImpl.getDefaultCertificateOfKey(id1Key1Name), id1Key1Cert2);
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700222
223 // get all certificates: id1Key1Cert1 and id1Key1Cert2
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700224 std::set<Name> certNames = pibImpl.getCertificatesOfKey(id1Key1Name);
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700225 BOOST_CHECK_EQUAL(certNames.size(), 2);
226 BOOST_CHECK_EQUAL(certNames.count(id1Key1Cert1.getName()), 1);
227 BOOST_CHECK_EQUAL(certNames.count(id1Key1Cert2.getName()), 1);
228
229 // remove id1Key1, should remove all the certs
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700230 pibImpl.removeKey(id1Key1Name);
231 certNames = pibImpl.getCertificatesOfKey(id1Key1Name);
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700232 BOOST_CHECK_EQUAL(certNames.size(), 0);
233}
234
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100235BOOST_AUTO_TEST_SUITE_END() // TestPibImpl
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700236BOOST_AUTO_TEST_SUITE_END() // Pib
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100237BOOST_AUTO_TEST_SUITE_END() // Security
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700238
239} // namespace tests
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700240} // namespace pib
Yingdi Yu3bf91f52015-06-12 19:39:40 -0700241} // namespace security
242} // namespace ndn