blob: 4e306bae3939c1720aa320a0ad78369b8cd2134b [file] [log] [blame]
Zhiyi Zhangf5246c42017-01-26 09:39:20 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento914d05f2019-07-13 16:20:19 -04002/*
Tianyuan Yu13aac732022-03-03 20:59:54 -08003 * Copyright (c) 2017-2022, Regents of the University of California.
Zhiyi Zhangf5246c42017-01-26 09:39:20 -08004 *
5 * This file is part of ndncert, a certificate management system based on NDN.
6 *
7 * ndncert is free software: you can redistribute it and/or modify it under the terms
8 * of the GNU General Public License as published by the Free Software Foundation, either
9 * version 3 of the License, or (at your option) any later version.
10 *
11 * ndncert 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 General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License along with
16 * ndncert, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
17 *
18 * See AUTHORS.md for complete list of ndncert authors and contributors.
19 */
20
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080021#include "ca-module.hpp"
Zhiyi Zhang84e11842020-11-19 20:03:23 -080022#include "challenge/challenge-module.hpp"
23#include "challenge/challenge-email.hpp"
24#include "challenge/challenge-pin.hpp"
Zhiyi Zhang062be6d2020-10-14 17:13:43 -070025#include "detail/info-encoder.hpp"
tylerliu4140fe82021-01-27 15:45:44 -080026#include "requester-request.hpp"
Zhiyi Zhang5d80e1e2020-09-25 11:34:54 -070027#include "test-common.hpp"
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080028
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080029namespace ndncert {
30namespace tests {
31
Zhiyi Zhang32d4b4e2020-10-28 22:10:49 -070032using namespace ca;
Davide Pesavento0dc02012021-11-23 22:55:03 -050033using ndn::util::DummyClientFace;
34using ndn::security::verifySignature;
Zhiyi Zhang32d4b4e2020-10-28 22:10:49 -070035
Zhiyi Zhangae123bf2017-04-14 12:24:53 -070036BOOST_FIXTURE_TEST_SUITE(TestCaModule, DatabaseFixture)
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080037
38BOOST_AUTO_TEST_CASE(Initialization)
39{
Davide Pesavento0dc02012021-11-23 22:55:03 -050040 DummyClientFace face(io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -070041 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhang44c6a352020-12-14 10:57:17 -080042 BOOST_CHECK_EQUAL(ca.getCaConf().caProfile.caPrefix, "/ndn");
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080043
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080044 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070045 BOOST_CHECK_EQUAL(ca.m_registeredPrefixHandles.size(), 1); // removed local discovery registration
Zhiyi Zhang696cd042020-10-07 21:27:36 -070046 BOOST_CHECK_EQUAL(ca.m_interestFilterHandles.size(), 5); // infoMeta, onProbe, onNew, onChallenge, onRevoke
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080047}
48
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070049BOOST_AUTO_TEST_CASE(HandleProfileFetching)
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070050{
51 auto identity = addIdentity(Name("/ndn"));
52 auto key = identity.getDefaultKey();
53 auto cert = key.getDefaultCertificate();
54
Davide Pesavento0dc02012021-11-23 22:55:03 -050055 DummyClientFace face(io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -070056 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070057 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangcd57da82020-10-08 20:35:40 -070058 auto profileData = ca.getCaProfileData();
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070059
Davide Pesavento0dc02012021-11-23 22:55:03 -050060 Interest interest = ndn::MetadataObject::makeDiscoveryInterest(Name("/ndn/CA/INFO"));
61 std::shared_ptr<Interest> infoInterest = nullptr;
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070062
Zhiyi Zhang696cd042020-10-07 21:27:36 -070063 face.setInterestFilter(
Davide Pesavento0dc02012021-11-23 22:55:03 -050064 ndn::InterestFilter("/ndn/CA/INFO"),
Zhiyi Zhang696cd042020-10-07 21:27:36 -070065 [&](const auto&, const Interest& interest) {
Zhiyi Zhangcd57da82020-10-08 20:35:40 -070066 if (interest.getName() == profileData.getName()) {
67 face.put(profileData);
68 }
69 },
70 nullptr, nullptr);
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070071 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070072
73 int count = 0;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070074 face.onSendData.connect([&](const Data& response) {
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070075 if (count == 0) {
76 count++;
77 auto block = response.getContent();
78 block.parse();
Davide Pesavento0dc02012021-11-23 22:55:03 -050079 infoInterest = std::make_shared<Interest>(Name(block.get(ndn::tlv::Name)).appendSegment(0));
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070080 }
81 else {
82 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -050083 BOOST_CHECK(verifySignature(response, cert));
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070084 auto contentBlock = response.getContent();
85 contentBlock.parse();
Zhiyi Zhangf22ae242020-11-17 10:51:15 -080086 auto caItem = infotlv::decodeDataContent(contentBlock);
Zhiyi Zhang44c6a352020-12-14 10:57:17 -080087 BOOST_CHECK_EQUAL(caItem.caPrefix, "/ndn");
88 BOOST_CHECK_EQUAL(caItem.probeParameterKeys.size(), 1);
89 BOOST_CHECK_EQUAL(caItem.probeParameterKeys.front(), "full name");
90 BOOST_CHECK_EQUAL(caItem.cert->wireEncode(), cert.wireEncode());
91 BOOST_CHECK_EQUAL(caItem.caInfo, "ndn testbed ca");
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070092 }
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070093 });
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080094 face.receive(interest);
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080095 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070096 face.receive(*infoInterest);
97 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangcd57da82020-10-08 20:35:40 -070098
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070099 BOOST_CHECK_EQUAL(count, 2);
Zhiyi Zhangf5246c42017-01-26 09:39:20 -0800100}
101
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700102BOOST_AUTO_TEST_CASE(HandleProbe)
103{
104 auto identity = addIdentity(Name("/ndn"));
105 auto key = identity.getDefaultKey();
106 auto cert = key.getDefaultCertificate();
107
Davide Pesavento0dc02012021-11-23 22:55:03 -0500108 DummyClientFace face(io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700109 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700110 advanceClocks(time::milliseconds(20), 60);
111
112 Interest interest("/ndn/CA/PROBE");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500113 Block paramTLV = ndn::makeEmptyBlock(ndn::tlv::ApplicationParameters);
114 paramTLV.push_back(ndn::makeStringBlock(tlv::ParameterKey, "name"));
115 paramTLV.push_back(ndn::makeStringBlock(tlv::ParameterValue, "zhiyi"));
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700116 paramTLV.encode();
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700117 interest.setApplicationParameters(paramTLV);
118
119 int count = 0;
120 face.onSendData.connect([&](const Data& response) {
121 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500122 BOOST_CHECK(verifySignature(response, cert));
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700123 Block contentBlock = response.getContent();
124 contentBlock.parse();
tylerliu50d679e2020-10-14 14:08:39 -0700125 Block probeResponse = contentBlock.get(tlv::ProbeResponse);
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700126 probeResponse.parse();
127 Name caName;
Zhiyi Zhang8f1ade32020-10-14 16:42:57 -0700128 caName.wireDecode(probeResponse.get(ndn::tlv::Name));
Zhiyi Zhang8683ec92020-10-07 18:18:35 -0700129 BOOST_CHECK_EQUAL(caName.size(), 2);
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700130 });
131 face.receive(interest);
132
133 advanceClocks(time::milliseconds(20), 60);
134 BOOST_CHECK_EQUAL(count, 1);
135}
136
Zhiyi Zhanga63b7372017-05-17 14:14:34 -0700137BOOST_AUTO_TEST_CASE(HandleProbeUsingDefaultHandler)
138{
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700139 auto identity = addIdentity(Name("/ndn"));
Zhiyi Zhanga63b7372017-05-17 14:14:34 -0700140 auto key = identity.getDefaultKey();
141 auto cert = key.getDefaultCertificate();
142
Davide Pesavento0dc02012021-11-23 22:55:03 -0500143 DummyClientFace face(io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700144 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhanga63b7372017-05-17 14:14:34 -0700145 advanceClocks(time::milliseconds(20), 60);
146
swa770de007bc2020-03-24 21:26:21 -0700147 Interest interest("/ndn/CA/PROBE");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500148 Block paramTLV = ndn::makeEmptyBlock(ndn::tlv::ApplicationParameters);
149 paramTLV.push_back(ndn::makeStringBlock(tlv::ParameterKey, "name"));
150 paramTLV.push_back(ndn::makeStringBlock(tlv::ParameterValue, "zhiyi"));
Suyong Won7968f7a2020-05-12 01:01:25 -0700151 paramTLV.encode();
Suyong Won7968f7a2020-05-12 01:01:25 -0700152 interest.setApplicationParameters(paramTLV);
Zhiyi Zhanga63b7372017-05-17 14:14:34 -0700153
154 int count = 0;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700155 face.onSendData.connect([&](const Data& response) {
156 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500157 BOOST_CHECK(verifySignature(response, cert));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700158 auto contentBlock = response.getContent();
159 contentBlock.parse();
tylerliu50d679e2020-10-14 14:08:39 -0700160 auto probeResponseBlock = contentBlock.get(tlv::ProbeResponse);
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700161 probeResponseBlock.parse();
162 Name caPrefix;
Zhiyi Zhang8f1ade32020-10-14 16:42:57 -0700163 caPrefix.wireDecode(probeResponseBlock.get(ndn::tlv::Name));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700164 BOOST_CHECK(caPrefix != "");
165 });
Zhiyi Zhanga63b7372017-05-17 14:14:34 -0700166 face.receive(interest);
167
168 advanceClocks(time::milliseconds(20), 60);
169 BOOST_CHECK_EQUAL(count, 1);
170}
171
Suyong Wone2afeb52020-10-04 03:05:39 +0900172BOOST_AUTO_TEST_CASE(HandleProbeRedirection)
173{
174 auto identity = addIdentity(Name("/ndn"));
175 auto key = identity.getDefaultKey();
176 auto cert = key.getDefaultCertificate();
177
Davide Pesavento0dc02012021-11-23 22:55:03 -0500178 DummyClientFace face(io, m_keyChain, {true, true});
Suyong Wone2afeb52020-10-04 03:05:39 +0900179 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-5", "ca-storage-memory");
Suyong Wone2afeb52020-10-04 03:05:39 +0900180 advanceClocks(time::milliseconds(20), 60);
181
182 Interest interest("/ndn/CA/PROBE");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500183 Block paramTLV = ndn::makeEmptyBlock(ndn::tlv::ApplicationParameters);
184 paramTLV.push_back(ndn::makeStringBlock(tlv::ParameterKey, "name"));
185 paramTLV.push_back(ndn::makeStringBlock(tlv::ParameterValue, "zhiyi"));
Suyong Wone2afeb52020-10-04 03:05:39 +0900186 paramTLV.encode();
Suyong Wone2afeb52020-10-04 03:05:39 +0900187 interest.setApplicationParameters(paramTLV);
188
189 int count = 0;
190 face.onSendData.connect([&](const Data& response) {
191 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500192 BOOST_CHECK(verifySignature(response, cert));
Suyong Wone2afeb52020-10-04 03:05:39 +0900193 Block contentBlock = response.getContent();
194 contentBlock.parse();
195
196 // Test CA sent redirections
Zhiyi Zhang34a8d432020-10-03 22:14:25 -0700197 std::vector<Name> redirectionItems;
198 for (auto item : contentBlock.elements()) {
tylerliu50d679e2020-10-14 14:08:39 -0700199 if (item.type() == tlv::ProbeRedirect) {
Zhiyi Zhang34a8d432020-10-03 22:14:25 -0700200 redirectionItems.push_back(Name(item.blockFromValue()));
201 }
Suyong Wone2afeb52020-10-04 03:05:39 +0900202 }
Zhiyi Zhang34a8d432020-10-03 22:14:25 -0700203 BOOST_CHECK_EQUAL(redirectionItems.size(), 2);
Tianyuan Yu13aac732022-03-03 20:59:54 -0800204 BOOST_CHECK_EQUAL(ndn::security::extractIdentityFromCertName(redirectionItems[0].getPrefix(-1)), "/ndn/edu/ucla");
205 BOOST_CHECK_EQUAL(ndn::security::extractIdentityFromCertName(redirectionItems[1].getPrefix(-1)), "/ndn/edu/ucla/cs/irl");
Suyong Wone2afeb52020-10-04 03:05:39 +0900206 });
207 face.receive(interest);
208 advanceClocks(time::milliseconds(20), 60);
209 BOOST_CHECK_EQUAL(count, 1);
210}
211
Zhiyi Zhangf5246c42017-01-26 09:39:20 -0800212BOOST_AUTO_TEST_CASE(HandleNew)
213{
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700214 auto identity = addIdentity(Name("/ndn"));
Zhiyi Zhangf5246c42017-01-26 09:39:20 -0800215 auto key = identity.getDefaultKey();
216 auto cert = key.getDefaultCertificate();
217
Davide Pesavento0dc02012021-11-23 22:55:03 -0500218 DummyClientFace face(io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700219 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhangf5246c42017-01-26 09:39:20 -0800220 advanceClocks(time::milliseconds(20), 60);
221
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700222 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800223 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500224 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800225 requester::Request state(m_keyChain, item, RequestType::NEW);
226 auto interest = state.genNewInterest(Name("/ndn/zhiyi"),
227 time::system_clock::now(),
228 time::system_clock::now() + time::days(1));
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800229
230 int count = 0;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700231 face.onSendData.connect([&](const Data& response) {
232 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500233 BOOST_CHECK(verifySignature(response, cert));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700234 auto contentBlock = response.getContent();
235 contentBlock.parse();
Suyong Won7968f7a2020-05-12 01:01:25 -0700236
tylerliu50d679e2020-10-14 14:08:39 -0700237 BOOST_CHECK(readString(contentBlock.get(tlv::EcdhPub)) != "");
238 BOOST_CHECK(readString(contentBlock.get(tlv::Salt)) != "");
239 BOOST_CHECK(readString(contentBlock.get(tlv::RequestId)) != "");
Suyong Won7968f7a2020-05-12 01:01:25 -0700240
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700241 auto challengeBlockCount = 0;
242 for (auto const& element : contentBlock.elements()) {
tylerliu50d679e2020-10-14 14:08:39 -0700243 if (element.type() == tlv::Challenge) {
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700244 challengeBlockCount++;
Suyong Won7968f7a2020-05-12 01:01:25 -0700245 }
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700246 }
Suyong Won7968f7a2020-05-12 01:01:25 -0700247
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700248 BOOST_CHECK(challengeBlockCount != 0);
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700249
tylerliu4140fe82021-01-27 15:45:44 -0800250 auto challengeList = state.onNewRenewRevokeResponse(response);
Zhiyi Zhangc9ada1b2020-10-29 19:13:15 -0700251 RequestId requestId;
Zhiyi Zhang8fdb36b2020-10-18 11:58:51 -0700252 std::memcpy(requestId.data(), contentBlock.get(tlv::RequestId).value(), contentBlock.get(tlv::RequestId).value_size());
tylerliu7b9185c2020-11-24 12:15:18 -0800253 auto ca_encryption_key = ca.getCaStorage()->getRequest(requestId).encryptionKey;
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800254 BOOST_CHECK_EQUAL_COLLECTIONS(state.m_aesKey.begin(), state.m_aesKey.end(),
Zhiyi Zhang1f9551b2020-10-30 10:30:43 -0700255 ca_encryption_key.begin(), ca_encryption_key.end());
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700256 });
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700257 face.receive(*interest);
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800258
259 advanceClocks(time::milliseconds(20), 60);
260 BOOST_CHECK_EQUAL(count, 1);
261}
262
Zhiyi Zhang1a735bc2019-07-04 21:36:49 -0700263BOOST_AUTO_TEST_CASE(HandleNewWithInvalidValidityPeriod1)
264{
265 auto identity = addIdentity(Name("/ndn"));
266 auto key = identity.getDefaultKey();
267 auto cert = key.getDefaultCertificate();
268
Davide Pesavento0dc02012021-11-23 22:55:03 -0500269 DummyClientFace face(io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700270 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1");
Zhiyi Zhang1a735bc2019-07-04 21:36:49 -0700271 advanceClocks(time::milliseconds(20), 60);
272
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700273 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800274 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500275 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800276 requester::Request state(m_keyChain, item, RequestType::NEW);
Zhiyi Zhang1a735bc2019-07-04 21:36:49 -0700277 auto current_tp = time::system_clock::now();
tylerliu4140fe82021-01-27 15:45:44 -0800278 auto interest1 = state.genNewInterest(Name("/ndn/zhiyi"), current_tp, current_tp - time::hours(1));
279 auto interest2 = state.genNewInterest(Name("/ndn/zhiyi"), current_tp, current_tp + time::days(361));
280 auto interest3 = state.genNewInterest(Name("/ndn/zhiyi"), current_tp - time::hours(1), current_tp + time::hours(2));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700281 face.onSendData.connect([&](const Data& response) {
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700282 auto contentTlv = response.getContent();
283 contentTlv.parse();
tylerliu50d679e2020-10-14 14:08:39 -0700284 auto errorCode = static_cast<ErrorCode>(readNonNegativeInteger(contentTlv.get(tlv::ErrorCode)));
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700285 BOOST_CHECK(errorCode != ErrorCode::NO_ERROR);
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700286 });
Zhiyi Zhang1a735bc2019-07-04 21:36:49 -0700287 face.receive(*interest1);
288 face.receive(*interest2);
289 face.receive(*interest3);
290
291 advanceClocks(time::milliseconds(20), 60);
292}
293
tylerliuf62cfeb2021-01-28 11:01:33 -0800294BOOST_AUTO_TEST_CASE(HandleNewWithServerBadValidity)
295{
296 auto identity = addIdentity(Name("/ndn"));
297 auto key = identity.getDefaultKey();
298
299 //build expired cert
Davide Pesavento0dc02012021-11-23 22:55:03 -0500300 Certificate cert;
tylerliuf62cfeb2021-01-28 11:01:33 -0800301 cert.setName(Name(key.getName()).append("self-sign").appendVersion());
302 cert.setContentType(ndn::tlv::ContentType_Key);
303 cert.setContent(key.getPublicKey().data(), key.getPublicKey().size());
304 SignatureInfo signatureInfo;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500305 signatureInfo.setValidityPeriod(ndn::security::ValidityPeriod(time::system_clock::now() - time::days(1),
306 time::system_clock::now() - time::seconds(1)));
tylerliuf62cfeb2021-01-28 11:01:33 -0800307 m_keyChain.sign(cert, signingByKey(key.getName()).setSignatureInfo(signatureInfo));
308 m_keyChain.setDefaultCertificate(key, cert);
309
Davide Pesavento0dc02012021-11-23 22:55:03 -0500310 DummyClientFace face(io, m_keyChain, {true, true});
tylerliuf62cfeb2021-01-28 11:01:33 -0800311 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
312 advanceClocks(time::milliseconds(20), 60);
313
314 CaProfile item;
315 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500316 item.cert = std::make_shared<Certificate>(cert);
tylerliuf62cfeb2021-01-28 11:01:33 -0800317 requester::Request state(m_keyChain, item, RequestType::NEW);
318 auto interest = state.genNewInterest(Name("/ndn/zhiyi"),
319 time::system_clock::now(),
320 time::system_clock::now() + time::days(1));
321
322 int count = 0;
323 face.onSendData.connect([&](const Data& response) {
324 auto contentTlv = response.getContent();
325 contentTlv.parse();
326 auto errorCode = static_cast<ErrorCode>(readNonNegativeInteger(contentTlv.get(tlv::ErrorCode)));
327 BOOST_CHECK(errorCode != ErrorCode::NO_ERROR);
328 count ++;
329 });
330 face.receive(*interest);
331
332 advanceClocks(time::milliseconds(20), 60);
333 BOOST_CHECK_EQUAL(count, 1);
334}
335
tylerliu0b6d0db2020-09-28 17:52:02 -0700336BOOST_AUTO_TEST_CASE(HandleNewWithLongSuffix)
337{
338 auto identity = addIdentity(Name("/ndn"));
339 auto key = identity.getDefaultKey();
340 auto cert = key.getDefaultCertificate();
341
Davide Pesavento0dc02012021-11-23 22:55:03 -0500342 DummyClientFace face(io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700343 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
tylerliu0b6d0db2020-09-28 17:52:02 -0700344 advanceClocks(time::milliseconds(20), 60);
345
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700346 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800347 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500348 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800349 requester::Request state(m_keyChain, item, RequestType::NEW);
tylerliu0b6d0db2020-09-28 17:52:02 -0700350
tylerliu4140fe82021-01-27 15:45:44 -0800351 auto interest1 = state.genNewInterest(Name("/ndn/a"), time::system_clock::now(),
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700352 time::system_clock::now() + time::days(1));
tylerliu4140fe82021-01-27 15:45:44 -0800353 auto interest2 = state.genNewInterest(Name("/ndn/a/b"), time::system_clock::now(),
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700354 time::system_clock::now() + time::days(1));
tylerliu4140fe82021-01-27 15:45:44 -0800355 auto interest3 = state.genNewInterest(Name("/ndn/a/b/c/d"), time::system_clock::now(),
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700356 time::system_clock::now() + time::days(1));
tylerliu0b6d0db2020-09-28 17:52:02 -0700357
tylerliu0b6d0db2020-09-28 17:52:02 -0700358 face.onSendData.connect([&](const Data& response) {
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700359 auto contentTlv = response.getContent();
360 contentTlv.parse();
361 if (interest3->getName().isPrefixOf(response.getName())) {
tylerliu50d679e2020-10-14 14:08:39 -0700362 auto errorCode = static_cast<ErrorCode>(readNonNegativeInteger(contentTlv.get(tlv::ErrorCode)));
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700363 BOOST_CHECK(errorCode != ErrorCode::NO_ERROR);
364 }
365 else {
366 // should successfully get responses
Davide Pesavento0dc02012021-11-23 22:55:03 -0500367 BOOST_CHECK_THROW(readNonNegativeInteger(contentTlv.get(tlv::ErrorCode)), std::runtime_error);
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700368 }
tylerliu0b6d0db2020-09-28 17:52:02 -0700369 });
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700370 face.receive(*interest1);
371 face.receive(*interest2);
372 face.receive(*interest3);
tylerliu0b6d0db2020-09-28 17:52:02 -0700373 advanceClocks(time::milliseconds(20), 60);
tylerliu0b6d0db2020-09-28 17:52:02 -0700374}
375
tylerliu0b6d0db2020-09-28 17:52:02 -0700376BOOST_AUTO_TEST_CASE(HandleNewWithInvalidLength1)
377{
378 auto identity = addIdentity(Name("/ndn"));
379 auto key = identity.getDefaultKey();
380 auto cert = key.getDefaultCertificate();
381
Davide Pesavento0dc02012021-11-23 22:55:03 -0500382 DummyClientFace face(io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700383 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1");
tylerliu0b6d0db2020-09-28 17:52:02 -0700384 advanceClocks(time::milliseconds(20), 60);
385
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700386 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800387 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500388 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800389 requester::Request state(m_keyChain, item, RequestType::NEW);
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700390
tylerliu0b6d0db2020-09-28 17:52:02 -0700391 auto current_tp = time::system_clock::now();
tylerliu4140fe82021-01-27 15:45:44 -0800392 auto interest1 = state.genNewInterest(Name("/ndn"), current_tp, current_tp + time::days(1));
393 auto interest2 = state.genNewInterest(Name("/ndn/a/b/c/d"), current_tp, current_tp + time::days(1));
tylerliu0b6d0db2020-09-28 17:52:02 -0700394 face.onSendData.connect([&](const Data& response) {
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700395 auto contentTlv = response.getContent();
396 contentTlv.parse();
tylerliu50d679e2020-10-14 14:08:39 -0700397 auto errorCode = static_cast<ErrorCode>(readNonNegativeInteger(contentTlv.get(tlv::ErrorCode)));
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700398 BOOST_CHECK(errorCode != ErrorCode::NO_ERROR);
tylerliu0b6d0db2020-09-28 17:52:02 -0700399 });
400 face.receive(*interest1);
401 face.receive(*interest2);
402
403 advanceClocks(time::milliseconds(20), 60);
404}
405
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700406BOOST_AUTO_TEST_CASE(HandleChallenge)
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800407{
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700408 auto identity = addIdentity(Name("/ndn"));
409 auto key = identity.getDefaultKey();
410 auto cert = key.getDefaultCertificate();
411
Davide Pesavento0dc02012021-11-23 22:55:03 -0500412 DummyClientFace face(io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700413 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800414 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700415
416 // generate NEW Interest
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700417 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800418 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500419 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800420 requester::Request state(m_keyChain, item, RequestType::NEW);
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700421
tylerliu4140fe82021-01-27 15:45:44 -0800422 auto newInterest = state.genNewInterest(Name("/ndn/zhiyi"), time::system_clock::now(),
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700423 time::system_clock::now() + time::days(1));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700424
425 // generate CHALLENGE Interest
Davide Pesavento0dc02012021-11-23 22:55:03 -0500426 std::shared_ptr<Interest> challengeInterest;
427 std::shared_ptr<Interest> challengeInterest2;
428 std::shared_ptr<Interest> challengeInterest3;
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800429
430 int count = 0;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700431 face.onSendData.connect([&](const Data& response) {
swa770de007bc2020-03-24 21:26:21 -0700432 if (Name("/ndn/CA/NEW").isPrefixOf(response.getName())) {
tylerliu4140fe82021-01-27 15:45:44 -0800433 auto challengeList = state.onNewRenewRevokeResponse(response);
434 auto paramList = state.selectOrContinueChallenge("pin");
435 challengeInterest = state.genChallengeInterest(std::move(paramList));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700436 }
swa770de007bc2020-03-24 21:26:21 -0700437 else if (Name("/ndn/CA/CHALLENGE").isPrefixOf(response.getName()) && count == 0) {
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800438 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500439 BOOST_CHECK(verifySignature(response, cert));
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800440
tylerliu4140fe82021-01-27 15:45:44 -0800441 state.onChallengeResponse(response);
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800442 BOOST_CHECK(state.m_status == Status::CHALLENGE);
443 BOOST_CHECK_EQUAL(state.m_challengeStatus, ChallengePin::NEED_CODE);
tylerliu4140fe82021-01-27 15:45:44 -0800444 auto paramList = state.selectOrContinueChallenge("pin");
445 challengeInterest2 = state.genChallengeInterest(std::move(paramList));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700446 }
swa770de007bc2020-03-24 21:26:21 -0700447 else if (Name("/ndn/CA/CHALLENGE").isPrefixOf(response.getName()) && count == 1) {
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700448 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500449 BOOST_CHECK(verifySignature(response, cert));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700450
tylerliu4140fe82021-01-27 15:45:44 -0800451 state.onChallengeResponse(response);
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800452 BOOST_CHECK(state.m_status == Status::CHALLENGE);
453 BOOST_CHECK_EQUAL(state.m_challengeStatus, ChallengePin::WRONG_CODE);
Davide Pesavento914d05f2019-07-13 16:20:19 -0400454
tylerliu4140fe82021-01-27 15:45:44 -0800455 auto paramList = state.selectOrContinueChallenge("pin");
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700456 auto request = ca.getCertificateRequest(*challengeInterest2);
tylerliu7b9185c2020-11-24 12:15:18 -0800457 auto secret = request->challengeState->secrets.get(ChallengePin::PARAMETER_KEY_CODE, "");
tylerliu40226332020-11-11 15:37:16 -0800458 paramList.begin()->second = secret;
tylerliu4140fe82021-01-27 15:45:44 -0800459 challengeInterest3 = state.genChallengeInterest(std::move(paramList));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700460 }
swa770de007bc2020-03-24 21:26:21 -0700461 else if (Name("/ndn/CA/CHALLENGE").isPrefixOf(response.getName()) && count == 2) {
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700462 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500463 BOOST_CHECK(verifySignature(response, cert));
tylerliu4140fe82021-01-27 15:45:44 -0800464 state.onChallengeResponse(response);
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800465 BOOST_CHECK(state.m_status == Status::SUCCESS);
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700466 }
Davide Pesavento914d05f2019-07-13 16:20:19 -0400467 });
468
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700469 face.receive(*newInterest);
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800470 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700471 face.receive(*challengeInterest);
472 advanceClocks(time::milliseconds(20), 60);
473 face.receive(*challengeInterest2);
474 advanceClocks(time::milliseconds(20), 60);
475 face.receive(*challengeInterest3);
476 advanceClocks(time::milliseconds(20), 60);
477 BOOST_CHECK_EQUAL(count, 3);
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800478}
479
tylerliu182bc532020-09-25 01:54:45 -0700480BOOST_AUTO_TEST_CASE(HandleRevoke)
481{
482 auto identity = addIdentity(Name("/ndn"));
483 auto key = identity.getDefaultKey();
484 auto cert = key.getDefaultCertificate();
485
Davide Pesavento0dc02012021-11-23 22:55:03 -0500486 DummyClientFace face(io, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700487 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
tylerliu182bc532020-09-25 01:54:45 -0700488 advanceClocks(time::milliseconds(20), 60);
489
490 //generate a certificate
491 auto clientIdentity = m_keyChain.createIdentity("/ndn/qwerty");
492 auto clientKey = clientIdentity.getDefaultKey();
Davide Pesavento0dc02012021-11-23 22:55:03 -0500493 Certificate clientCert;
tylerliu182bc532020-09-25 01:54:45 -0700494 clientCert.setName(Name(clientKey.getName()).append("cert-request").appendVersion());
Zhiyi Zhang8f1ade32020-10-14 16:42:57 -0700495 clientCert.setContentType(ndn::tlv::ContentType_Key);
tylerliu182bc532020-09-25 01:54:45 -0700496 clientCert.setFreshnessPeriod(time::hours(24));
497 clientCert.setContent(clientKey.getPublicKey().data(), clientKey.getPublicKey().size());
498 SignatureInfo signatureInfo;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500499 signatureInfo.setValidityPeriod(ndn::security::ValidityPeriod(time::system_clock::now(),
500 time::system_clock::now() + time::hours(10)));
tylerliu182bc532020-09-25 01:54:45 -0700501 m_keyChain.sign(clientCert, signingByKey(clientKey.getName()).setSignatureInfo(signatureInfo));
Zhiyi Zhang1f5e86e2020-12-04 15:07:57 -0800502 RequestId requestId = {{101}};
503 RequestState certRequest;
504 certRequest.caPrefix = Name("/ndn");
505 certRequest.requestId = requestId;
506 certRequest.requestType = RequestType::NEW;
507 certRequest.status = Status::SUCCESS;
508 certRequest.cert = clientCert;
tylerliu182bc532020-09-25 01:54:45 -0700509 auto issuedCert = ca.issueCertificate(certRequest);
510
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700511 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800512 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500513 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800514 requester::Request state(m_keyChain, item, RequestType::REVOKE);
tylerliu182bc532020-09-25 01:54:45 -0700515
tylerliu4140fe82021-01-27 15:45:44 -0800516 auto interest = state.genRevokeInterest(issuedCert);
tylerliu182bc532020-09-25 01:54:45 -0700517
518 int count = 0;
Zhiyi Zhang46049832020-09-28 17:08:12 -0700519 face.onSendData.connect([&](const Data& response) {
tylerliu182bc532020-09-25 01:54:45 -0700520 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500521 BOOST_CHECK(verifySignature(response, cert));
tylerliu182bc532020-09-25 01:54:45 -0700522 auto contentBlock = response.getContent();
523 contentBlock.parse();
524
tylerliu50d679e2020-10-14 14:08:39 -0700525 BOOST_CHECK(readString(contentBlock.get(tlv::EcdhPub)) != "");
526 BOOST_CHECK(readString(contentBlock.get(tlv::Salt)) != "");
527 BOOST_CHECK(readString(contentBlock.get(tlv::RequestId)) != "");
tylerliu182bc532020-09-25 01:54:45 -0700528
529 auto challengeBlockCount = 0;
530 for (auto const& element : contentBlock.elements()) {
tylerliu50d679e2020-10-14 14:08:39 -0700531 if (element.type() == tlv::Challenge) {
Zhiyi Zhang46049832020-09-28 17:08:12 -0700532 challengeBlockCount++;
533 }
tylerliu182bc532020-09-25 01:54:45 -0700534 }
535
536 BOOST_CHECK(challengeBlockCount != 0);
537
tylerliu4140fe82021-01-27 15:45:44 -0800538 auto challengeList = state.onNewRenewRevokeResponse(response);
Zhiyi Zhangc9ada1b2020-10-29 19:13:15 -0700539 RequestId requestId;
Zhiyi Zhang8fdb36b2020-10-18 11:58:51 -0700540 std::memcpy(requestId.data(), contentBlock.get(tlv::RequestId).value(), contentBlock.get(tlv::RequestId).value_size());
tylerliu7b9185c2020-11-24 12:15:18 -0800541 auto ca_encryption_key = ca.getCaStorage()->getRequest(requestId).encryptionKey;
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800542 BOOST_CHECK_EQUAL_COLLECTIONS(state.m_aesKey.begin(), state.m_aesKey.end(),
Zhiyi Zhang1f9551b2020-10-30 10:30:43 -0700543 ca_encryption_key.begin(), ca_encryption_key.end());
tylerliu182bc532020-09-25 01:54:45 -0700544 });
545 face.receive(*interest);
546
547 advanceClocks(time::milliseconds(20), 60);
548 BOOST_CHECK_EQUAL(count, 1);
549}
550
551BOOST_AUTO_TEST_CASE(HandleRevokeWithBadCert)
552{
553 auto identity = addIdentity(Name("/ndn"));
554 auto key = identity.getDefaultKey();
555 auto cert = key.getDefaultCertificate();
556
Davide Pesavento0dc02012021-11-23 22:55:03 -0500557 DummyClientFace face(io, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700558 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
tylerliu182bc532020-09-25 01:54:45 -0700559 advanceClocks(time::milliseconds(20), 60);
560
Zhiyi Zhang3e8ca252020-09-30 17:18:38 -0700561 // generate a certificate
tylerliu182bc532020-09-25 01:54:45 -0700562 auto clientIdentity = m_keyChain.createIdentity("/ndn/qwerty");
563 auto clientKey = clientIdentity.getDefaultKey();
Davide Pesavento0dc02012021-11-23 22:55:03 -0500564 Certificate clientCert;
565 clientCert.setName(Name(clientKey.getName()).append("NDNCERT").append("1473283247810732701"));
Zhiyi Zhang8f1ade32020-10-14 16:42:57 -0700566 clientCert.setContentType(ndn::tlv::ContentType_Key);
tylerliu182bc532020-09-25 01:54:45 -0700567 clientCert.setFreshnessPeriod(time::hours(24));
568 clientCert.setContent(clientKey.getPublicKey().data(), clientKey.getPublicKey().size());
569 SignatureInfo signatureInfo;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500570 signatureInfo.setValidityPeriod(ndn::security::ValidityPeriod(time::system_clock::now(),
571 time::system_clock::now() + time::hours(10)));
tylerliu182bc532020-09-25 01:54:45 -0700572 m_keyChain.sign(clientCert, signingByKey(clientKey.getName()).setSignatureInfo(signatureInfo));
573
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700574 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800575 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500576 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800577 requester::Request state(m_keyChain, item, RequestType::NEW);
tylerliu182bc532020-09-25 01:54:45 -0700578
tylerliu4140fe82021-01-27 15:45:44 -0800579 auto interest = state.genRevokeInterest(clientCert);
tylerliu182bc532020-09-25 01:54:45 -0700580
Zhiyi Zhang3e8ca252020-09-30 17:18:38 -0700581 bool receiveData = false;
Zhiyi Zhang46049832020-09-28 17:08:12 -0700582 face.onSendData.connect([&](const Data& response) {
Zhiyi Zhang3e8ca252020-09-30 17:18:38 -0700583 receiveData = true;
584 auto contentTlv = response.getContent();
585 contentTlv.parse();
tylerliu50d679e2020-10-14 14:08:39 -0700586 BOOST_CHECK(static_cast<ErrorCode>(readNonNegativeInteger(contentTlv.get(tlv::ErrorCode))) != ErrorCode::NO_ERROR);
tylerliu182bc532020-09-25 01:54:45 -0700587 });
588 face.receive(*interest);
589
590 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhang3e8ca252020-09-30 17:18:38 -0700591 BOOST_CHECK_EQUAL(receiveData, true);
tylerliu182bc532020-09-25 01:54:45 -0700592}
593
Davide Pesavento0dc02012021-11-23 22:55:03 -0500594BOOST_AUTO_TEST_SUITE_END() // TestCaModule
Zhiyi Zhangf5246c42017-01-26 09:39:20 -0800595
Zhiyi Zhange4891b72020-10-10 15:11:57 -0700596} // namespace tests
597} // namespace ndncert