blob: 9fcee0f81005fb7dd5fa51c6c612866e1af726bf [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/*
Davide Pesavento842f1f72024-02-21 21:27:25 -05003 * Copyright (c) 2017-2024, 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-pin.hpp"
Zhiyi Zhang062be6d2020-10-14 17:13:43 -070023#include "detail/info-encoder.hpp"
tylerliu4140fe82021-01-27 15:45:44 -080024#include "requester-request.hpp"
Davide Pesavento0d1d11c2022-04-11 22:11:34 -040025
Davide Pesavento829aff62022-05-15 20:30:34 -040026#include "tests/boost-test.hpp"
27#include "tests/io-key-chain-fixture.hpp"
28
29#include <ndn-cxx/metadata-object.hpp>
Davide Pesavento842f1f72024-02-21 21:27:25 -050030#include <ndn-cxx/security/signing-helpers.hpp>
Davide Pesavento829aff62022-05-15 20:30:34 -040031#include <ndn-cxx/security/verification-helpers.hpp>
32#include <ndn-cxx/util/dummy-client-face.hpp>
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080033
Davide Pesavento0d1d11c2022-04-11 22:11:34 -040034namespace ndncert::tests {
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080035
Zhiyi Zhang32d4b4e2020-10-28 22:10:49 -070036using namespace ca;
Davide Pesavento0dc02012021-11-23 22:55:03 -050037using ndn::security::verifySignature;
Zhiyi Zhang32d4b4e2020-10-28 22:10:49 -070038
Davide Pesavento829aff62022-05-15 20:30:34 -040039BOOST_FIXTURE_TEST_SUITE(TestCaModule, IoKeyChainFixture)
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080040
41BOOST_AUTO_TEST_CASE(Initialization)
42{
Davide Pesavento76304d82023-08-10 23:38:06 -040043 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -070044 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhang44c6a352020-12-14 10:57:17 -080045 BOOST_CHECK_EQUAL(ca.getCaConf().caProfile.caPrefix, "/ndn");
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080046
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080047 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070048 BOOST_CHECK_EQUAL(ca.m_registeredPrefixHandles.size(), 1); // removed local discovery registration
Zhiyi Zhang696cd042020-10-07 21:27:36 -070049 BOOST_CHECK_EQUAL(ca.m_interestFilterHandles.size(), 5); // infoMeta, onProbe, onNew, onChallenge, onRevoke
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080050}
51
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070052BOOST_AUTO_TEST_CASE(HandleProfileFetching)
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070053{
Davide Pesavento829aff62022-05-15 20:30:34 -040054 auto identity = m_keyChain.createIdentity(Name("/ndn"));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070055 auto key = identity.getDefaultKey();
56 auto cert = key.getDefaultCertificate();
57
Davide Pesavento76304d82023-08-10 23:38:06 -040058 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -070059 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070060 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangcd57da82020-10-08 20:35:40 -070061 auto profileData = ca.getCaProfileData();
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070062
Davide Pesavento0dc02012021-11-23 22:55:03 -050063 Interest interest = ndn::MetadataObject::makeDiscoveryInterest(Name("/ndn/CA/INFO"));
64 std::shared_ptr<Interest> infoInterest = nullptr;
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070065
Zhiyi Zhang696cd042020-10-07 21:27:36 -070066 face.setInterestFilter(
Davide Pesavento0dc02012021-11-23 22:55:03 -050067 ndn::InterestFilter("/ndn/CA/INFO"),
Zhiyi Zhang696cd042020-10-07 21:27:36 -070068 [&](const auto&, const Interest& interest) {
Zhiyi Zhangcd57da82020-10-08 20:35:40 -070069 if (interest.getName() == profileData.getName()) {
70 face.put(profileData);
71 }
72 },
73 nullptr, nullptr);
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070074 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070075
76 int count = 0;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070077 face.onSendData.connect([&](const Data& response) {
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070078 if (count == 0) {
79 count++;
80 auto block = response.getContent();
81 block.parse();
Davide Pesavento0dc02012021-11-23 22:55:03 -050082 infoInterest = std::make_shared<Interest>(Name(block.get(ndn::tlv::Name)).appendSegment(0));
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070083 }
84 else {
85 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -050086 BOOST_CHECK(verifySignature(response, cert));
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070087 auto contentBlock = response.getContent();
88 contentBlock.parse();
Zhiyi Zhangf22ae242020-11-17 10:51:15 -080089 auto caItem = infotlv::decodeDataContent(contentBlock);
Zhiyi Zhang44c6a352020-12-14 10:57:17 -080090 BOOST_CHECK_EQUAL(caItem.caPrefix, "/ndn");
91 BOOST_CHECK_EQUAL(caItem.probeParameterKeys.size(), 1);
92 BOOST_CHECK_EQUAL(caItem.probeParameterKeys.front(), "full name");
93 BOOST_CHECK_EQUAL(caItem.cert->wireEncode(), cert.wireEncode());
94 BOOST_CHECK_EQUAL(caItem.caInfo, "ndn testbed ca");
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070095 }
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070096 });
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080097 face.receive(interest);
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080098 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070099 face.receive(*infoInterest);
100 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangcd57da82020-10-08 20:35:40 -0700101
Zhiyi Zhangfbcab842020-10-07 15:17:13 -0700102 BOOST_CHECK_EQUAL(count, 2);
Zhiyi Zhangf5246c42017-01-26 09:39:20 -0800103}
104
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700105BOOST_AUTO_TEST_CASE(HandleProbe)
106{
Davide Pesavento829aff62022-05-15 20:30:34 -0400107 auto identity = m_keyChain.createIdentity(Name("/ndn"));
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700108 auto key = identity.getDefaultKey();
109 auto cert = key.getDefaultCertificate();
110
Davide Pesavento76304d82023-08-10 23:38:06 -0400111 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700112 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700113 advanceClocks(time::milliseconds(20), 60);
114
115 Interest interest("/ndn/CA/PROBE");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500116 Block paramTLV = ndn::makeEmptyBlock(ndn::tlv::ApplicationParameters);
117 paramTLV.push_back(ndn::makeStringBlock(tlv::ParameterKey, "name"));
118 paramTLV.push_back(ndn::makeStringBlock(tlv::ParameterValue, "zhiyi"));
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700119 paramTLV.encode();
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700120 interest.setApplicationParameters(paramTLV);
121
122 int count = 0;
123 face.onSendData.connect([&](const Data& response) {
124 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500125 BOOST_CHECK(verifySignature(response, cert));
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700126 Block contentBlock = response.getContent();
127 contentBlock.parse();
tylerliu50d679e2020-10-14 14:08:39 -0700128 Block probeResponse = contentBlock.get(tlv::ProbeResponse);
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700129 probeResponse.parse();
130 Name caName;
Zhiyi Zhang8f1ade32020-10-14 16:42:57 -0700131 caName.wireDecode(probeResponse.get(ndn::tlv::Name));
Zhiyi Zhang8683ec92020-10-07 18:18:35 -0700132 BOOST_CHECK_EQUAL(caName.size(), 2);
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700133 });
134 face.receive(interest);
135
136 advanceClocks(time::milliseconds(20), 60);
137 BOOST_CHECK_EQUAL(count, 1);
138}
139
Zhiyi Zhanga63b7372017-05-17 14:14:34 -0700140BOOST_AUTO_TEST_CASE(HandleProbeUsingDefaultHandler)
141{
Davide Pesavento829aff62022-05-15 20:30:34 -0400142 auto identity = m_keyChain.createIdentity(Name("/ndn"));
Zhiyi Zhanga63b7372017-05-17 14:14:34 -0700143 auto key = identity.getDefaultKey();
144 auto cert = key.getDefaultCertificate();
145
Davide Pesavento76304d82023-08-10 23:38:06 -0400146 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700147 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhanga63b7372017-05-17 14:14:34 -0700148 advanceClocks(time::milliseconds(20), 60);
149
swa770de007bc2020-03-24 21:26:21 -0700150 Interest interest("/ndn/CA/PROBE");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500151 Block paramTLV = ndn::makeEmptyBlock(ndn::tlv::ApplicationParameters);
152 paramTLV.push_back(ndn::makeStringBlock(tlv::ParameterKey, "name"));
153 paramTLV.push_back(ndn::makeStringBlock(tlv::ParameterValue, "zhiyi"));
Suyong Won7968f7a2020-05-12 01:01:25 -0700154 paramTLV.encode();
Suyong Won7968f7a2020-05-12 01:01:25 -0700155 interest.setApplicationParameters(paramTLV);
Zhiyi Zhanga63b7372017-05-17 14:14:34 -0700156
157 int count = 0;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700158 face.onSendData.connect([&](const Data& response) {
159 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500160 BOOST_CHECK(verifySignature(response, cert));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700161 auto contentBlock = response.getContent();
162 contentBlock.parse();
tylerliu50d679e2020-10-14 14:08:39 -0700163 auto probeResponseBlock = contentBlock.get(tlv::ProbeResponse);
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700164 probeResponseBlock.parse();
165 Name caPrefix;
Zhiyi Zhang8f1ade32020-10-14 16:42:57 -0700166 caPrefix.wireDecode(probeResponseBlock.get(ndn::tlv::Name));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700167 BOOST_CHECK(caPrefix != "");
168 });
Zhiyi Zhanga63b7372017-05-17 14:14:34 -0700169 face.receive(interest);
170
171 advanceClocks(time::milliseconds(20), 60);
172 BOOST_CHECK_EQUAL(count, 1);
173}
174
Suyong Wone2afeb52020-10-04 03:05:39 +0900175BOOST_AUTO_TEST_CASE(HandleProbeRedirection)
176{
Davide Pesavento829aff62022-05-15 20:30:34 -0400177 auto identity = m_keyChain.createIdentity(Name("/ndn"));
Suyong Wone2afeb52020-10-04 03:05:39 +0900178 auto key = identity.getDefaultKey();
179 auto cert = key.getDefaultCertificate();
180
Davide Pesavento76304d82023-08-10 23:38:06 -0400181 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Suyong Wone2afeb52020-10-04 03:05:39 +0900182 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-5", "ca-storage-memory");
Suyong Wone2afeb52020-10-04 03:05:39 +0900183 advanceClocks(time::milliseconds(20), 60);
184
185 Interest interest("/ndn/CA/PROBE");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500186 Block paramTLV = ndn::makeEmptyBlock(ndn::tlv::ApplicationParameters);
187 paramTLV.push_back(ndn::makeStringBlock(tlv::ParameterKey, "name"));
188 paramTLV.push_back(ndn::makeStringBlock(tlv::ParameterValue, "zhiyi"));
Suyong Wone2afeb52020-10-04 03:05:39 +0900189 paramTLV.encode();
Suyong Wone2afeb52020-10-04 03:05:39 +0900190 interest.setApplicationParameters(paramTLV);
191
192 int count = 0;
193 face.onSendData.connect([&](const Data& response) {
194 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500195 BOOST_CHECK(verifySignature(response, cert));
Suyong Wone2afeb52020-10-04 03:05:39 +0900196 Block contentBlock = response.getContent();
197 contentBlock.parse();
198
199 // Test CA sent redirections
Zhiyi Zhang34a8d432020-10-03 22:14:25 -0700200 std::vector<Name> redirectionItems;
201 for (auto item : contentBlock.elements()) {
tylerliu50d679e2020-10-14 14:08:39 -0700202 if (item.type() == tlv::ProbeRedirect) {
Zhiyi Zhang34a8d432020-10-03 22:14:25 -0700203 redirectionItems.push_back(Name(item.blockFromValue()));
204 }
Suyong Wone2afeb52020-10-04 03:05:39 +0900205 }
Zhiyi Zhang34a8d432020-10-03 22:14:25 -0700206 BOOST_CHECK_EQUAL(redirectionItems.size(), 2);
Tianyuan Yu13aac732022-03-03 20:59:54 -0800207 BOOST_CHECK_EQUAL(ndn::security::extractIdentityFromCertName(redirectionItems[0].getPrefix(-1)), "/ndn/edu/ucla");
208 BOOST_CHECK_EQUAL(ndn::security::extractIdentityFromCertName(redirectionItems[1].getPrefix(-1)), "/ndn/edu/ucla/cs/irl");
Suyong Wone2afeb52020-10-04 03:05:39 +0900209 });
210 face.receive(interest);
211 advanceClocks(time::milliseconds(20), 60);
212 BOOST_CHECK_EQUAL(count, 1);
213}
214
Zhiyi Zhangf5246c42017-01-26 09:39:20 -0800215BOOST_AUTO_TEST_CASE(HandleNew)
216{
Davide Pesavento829aff62022-05-15 20:30:34 -0400217 auto identity = m_keyChain.createIdentity(Name("/ndn"));
Zhiyi Zhangf5246c42017-01-26 09:39:20 -0800218 auto key = identity.getDefaultKey();
219 auto cert = key.getDefaultCertificate();
220
Davide Pesavento76304d82023-08-10 23:38:06 -0400221 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700222 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhangf5246c42017-01-26 09:39:20 -0800223 advanceClocks(time::milliseconds(20), 60);
224
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700225 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800226 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500227 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800228 requester::Request state(m_keyChain, item, RequestType::NEW);
Davide Pesavento829aff62022-05-15 20:30:34 -0400229 auto interest = state.genNewInterest(m_keyChain.createIdentity(Name("/ndn/zhiyi")).getDefaultKey().getName(),
tylerliu4140fe82021-01-27 15:45:44 -0800230 time::system_clock::now(),
231 time::system_clock::now() + time::days(1));
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800232
233 int count = 0;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700234 face.onSendData.connect([&](const Data& response) {
235 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500236 BOOST_CHECK(verifySignature(response, cert));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700237 auto contentBlock = response.getContent();
238 contentBlock.parse();
Suyong Won7968f7a2020-05-12 01:01:25 -0700239
tylerliu50d679e2020-10-14 14:08:39 -0700240 BOOST_CHECK(readString(contentBlock.get(tlv::EcdhPub)) != "");
241 BOOST_CHECK(readString(contentBlock.get(tlv::Salt)) != "");
242 BOOST_CHECK(readString(contentBlock.get(tlv::RequestId)) != "");
Suyong Won7968f7a2020-05-12 01:01:25 -0700243
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700244 auto challengeBlockCount = 0;
245 for (auto const& element : contentBlock.elements()) {
tylerliu50d679e2020-10-14 14:08:39 -0700246 if (element.type() == tlv::Challenge) {
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700247 challengeBlockCount++;
Suyong Won7968f7a2020-05-12 01:01:25 -0700248 }
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700249 }
Suyong Won7968f7a2020-05-12 01:01:25 -0700250
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700251 BOOST_CHECK(challengeBlockCount != 0);
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700252
tylerliu4140fe82021-01-27 15:45:44 -0800253 auto challengeList = state.onNewRenewRevokeResponse(response);
Zhiyi Zhangc9ada1b2020-10-29 19:13:15 -0700254 RequestId requestId;
Zhiyi Zhang8fdb36b2020-10-18 11:58:51 -0700255 std::memcpy(requestId.data(), contentBlock.get(tlv::RequestId).value(), contentBlock.get(tlv::RequestId).value_size());
tylerliu7b9185c2020-11-24 12:15:18 -0800256 auto ca_encryption_key = ca.getCaStorage()->getRequest(requestId).encryptionKey;
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800257 BOOST_CHECK_EQUAL_COLLECTIONS(state.m_aesKey.begin(), state.m_aesKey.end(),
Zhiyi Zhang1f9551b2020-10-30 10:30:43 -0700258 ca_encryption_key.begin(), ca_encryption_key.end());
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700259 });
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700260 face.receive(*interest);
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800261
262 advanceClocks(time::milliseconds(20), 60);
263 BOOST_CHECK_EQUAL(count, 1);
264}
265
Zhiyi Zhang1a735bc2019-07-04 21:36:49 -0700266BOOST_AUTO_TEST_CASE(HandleNewWithInvalidValidityPeriod1)
267{
Davide Pesavento829aff62022-05-15 20:30:34 -0400268 auto identity = m_keyChain.createIdentity(Name("/ndn"));
Zhiyi Zhang1a735bc2019-07-04 21:36:49 -0700269 auto key = identity.getDefaultKey();
270 auto cert = key.getDefaultCertificate();
271
Davide Pesavento76304d82023-08-10 23:38:06 -0400272 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700273 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1");
Zhiyi Zhang1a735bc2019-07-04 21:36:49 -0700274 advanceClocks(time::milliseconds(20), 60);
275
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700276 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800277 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500278 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800279 requester::Request state(m_keyChain, item, RequestType::NEW);
Davide Pesavento829aff62022-05-15 20:30:34 -0400280 auto client = m_keyChain.createIdentity(Name("/ndn/zhiyi"));
Zhiyi Zhang1a735bc2019-07-04 21:36:49 -0700281 auto current_tp = time::system_clock::now();
Tianyuan Yuca23bb02022-03-09 14:09:14 -0800282 auto interest1 = state.genNewInterest(client.getDefaultKey().getName(), current_tp, current_tp - time::hours(1));
283 auto interest2 = state.genNewInterest(client.getDefaultKey().getName(), current_tp, current_tp + time::days(361));
284 auto interest3 = state.genNewInterest(client.getDefaultKey().getName(),
285 current_tp - time::hours(1), current_tp + time::hours(2));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700286 face.onSendData.connect([&](const Data& response) {
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700287 auto contentTlv = response.getContent();
288 contentTlv.parse();
tylerliu50d679e2020-10-14 14:08:39 -0700289 auto errorCode = static_cast<ErrorCode>(readNonNegativeInteger(contentTlv.get(tlv::ErrorCode)));
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700290 BOOST_CHECK(errorCode != ErrorCode::NO_ERROR);
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700291 });
Zhiyi Zhang1a735bc2019-07-04 21:36:49 -0700292 face.receive(*interest1);
293 face.receive(*interest2);
294 face.receive(*interest3);
295
296 advanceClocks(time::milliseconds(20), 60);
297}
298
tylerliuf62cfeb2021-01-28 11:01:33 -0800299BOOST_AUTO_TEST_CASE(HandleNewWithServerBadValidity)
300{
Davide Pesavento829aff62022-05-15 20:30:34 -0400301 auto identity = m_keyChain.createIdentity(Name("/ndn"));
tylerliuf62cfeb2021-01-28 11:01:33 -0800302 auto key = identity.getDefaultKey();
303
304 //build expired cert
Davide Pesavento0dc02012021-11-23 22:55:03 -0500305 Certificate cert;
tylerliuf62cfeb2021-01-28 11:01:33 -0800306 cert.setName(Name(key.getName()).append("self-sign").appendVersion());
307 cert.setContentType(ndn::tlv::ContentType_Key);
Davide Pesavento6f1a2ab2022-03-17 03:57:21 -0400308 cert.setContent(key.getPublicKey());
tylerliuf62cfeb2021-01-28 11:01:33 -0800309 SignatureInfo signatureInfo;
Davide Pesavento829aff62022-05-15 20:30:34 -0400310 signatureInfo.setValidityPeriod(ndn::security::ValidityPeriod::makeRelative(-1_days, -1_s));
tylerliuf62cfeb2021-01-28 11:01:33 -0800311 m_keyChain.sign(cert, signingByKey(key.getName()).setSignatureInfo(signatureInfo));
312 m_keyChain.setDefaultCertificate(key, cert);
313
Davide Pesavento76304d82023-08-10 23:38:06 -0400314 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
tylerliuf62cfeb2021-01-28 11:01:33 -0800315 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
316 advanceClocks(time::milliseconds(20), 60);
317
318 CaProfile item;
319 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500320 item.cert = std::make_shared<Certificate>(cert);
tylerliuf62cfeb2021-01-28 11:01:33 -0800321 requester::Request state(m_keyChain, item, RequestType::NEW);
Davide Pesavento829aff62022-05-15 20:30:34 -0400322 auto interest = state.genNewInterest(m_keyChain.createIdentity(Name("/ndn/zhiyi")).getDefaultKey().getName(),
tylerliuf62cfeb2021-01-28 11:01:33 -0800323 time::system_clock::now(),
324 time::system_clock::now() + time::days(1));
325
326 int count = 0;
327 face.onSendData.connect([&](const Data& response) {
328 auto contentTlv = response.getContent();
329 contentTlv.parse();
330 auto errorCode = static_cast<ErrorCode>(readNonNegativeInteger(contentTlv.get(tlv::ErrorCode)));
331 BOOST_CHECK(errorCode != ErrorCode::NO_ERROR);
332 count ++;
333 });
334 face.receive(*interest);
335
336 advanceClocks(time::milliseconds(20), 60);
337 BOOST_CHECK_EQUAL(count, 1);
338}
339
tylerliu0b6d0db2020-09-28 17:52:02 -0700340BOOST_AUTO_TEST_CASE(HandleNewWithLongSuffix)
341{
Davide Pesavento829aff62022-05-15 20:30:34 -0400342 auto identity = m_keyChain.createIdentity(Name("/ndn"));
tylerliu0b6d0db2020-09-28 17:52:02 -0700343 auto key = identity.getDefaultKey();
344 auto cert = key.getDefaultCertificate();
345
Davide Pesavento76304d82023-08-10 23:38:06 -0400346 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700347 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
tylerliu0b6d0db2020-09-28 17:52:02 -0700348 advanceClocks(time::milliseconds(20), 60);
349
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700350 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800351 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500352 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800353 requester::Request state(m_keyChain, item, RequestType::NEW);
tylerliu0b6d0db2020-09-28 17:52:02 -0700354
Davide Pesavento829aff62022-05-15 20:30:34 -0400355 auto interest1 = state.genNewInterest(m_keyChain.createIdentity(Name("/ndn/a")).getDefaultKey().getName(),
356 time::system_clock::now(),
357 time::system_clock::now() + time::days(1));
358 auto interest2 = state.genNewInterest(m_keyChain.createIdentity(Name("/ndn/a/b")).getDefaultKey().getName(),
359 time::system_clock::now(),
360 time::system_clock::now() + time::days(1));
361 auto interest3 = state.genNewInterest(m_keyChain.createIdentity(Name("/ndn/a/b/c/d")).getDefaultKey().getName(),
362 time::system_clock::now(),
363 time::system_clock::now() + time::days(1));
tylerliu0b6d0db2020-09-28 17:52:02 -0700364
tylerliu0b6d0db2020-09-28 17:52:02 -0700365 face.onSendData.connect([&](const Data& response) {
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700366 auto contentTlv = response.getContent();
367 contentTlv.parse();
368 if (interest3->getName().isPrefixOf(response.getName())) {
tylerliu50d679e2020-10-14 14:08:39 -0700369 auto errorCode = static_cast<ErrorCode>(readNonNegativeInteger(contentTlv.get(tlv::ErrorCode)));
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700370 BOOST_CHECK(errorCode != ErrorCode::NO_ERROR);
371 }
372 else {
373 // should successfully get responses
Davide Pesavento0dc02012021-11-23 22:55:03 -0500374 BOOST_CHECK_THROW(readNonNegativeInteger(contentTlv.get(tlv::ErrorCode)), std::runtime_error);
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700375 }
tylerliu0b6d0db2020-09-28 17:52:02 -0700376 });
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700377 face.receive(*interest1);
378 face.receive(*interest2);
379 face.receive(*interest3);
tylerliu0b6d0db2020-09-28 17:52:02 -0700380 advanceClocks(time::milliseconds(20), 60);
tylerliu0b6d0db2020-09-28 17:52:02 -0700381}
382
tylerliu0b6d0db2020-09-28 17:52:02 -0700383BOOST_AUTO_TEST_CASE(HandleNewWithInvalidLength1)
384{
Davide Pesavento829aff62022-05-15 20:30:34 -0400385 auto identity = m_keyChain.createIdentity(Name("/ndn"));
tylerliu0b6d0db2020-09-28 17:52:02 -0700386 auto key = identity.getDefaultKey();
387 auto cert = key.getDefaultCertificate();
388
Davide Pesavento76304d82023-08-10 23:38:06 -0400389 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700390 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1");
tylerliu0b6d0db2020-09-28 17:52:02 -0700391 advanceClocks(time::milliseconds(20), 60);
392
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700393 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800394 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500395 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800396 requester::Request state(m_keyChain, item, RequestType::NEW);
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700397
tylerliu0b6d0db2020-09-28 17:52:02 -0700398 auto current_tp = time::system_clock::now();
Tianyuan Yuca23bb02022-03-09 14:09:14 -0800399 auto interest1 = state.genNewInterest(identity.getDefaultKey().getName(), current_tp, current_tp + time::days(1));
Davide Pesavento829aff62022-05-15 20:30:34 -0400400 auto interest2 = state.genNewInterest(m_keyChain.createIdentity(Name("/ndn/a/b/c/d")).getDefaultKey().getName(),
Tianyuan Yuca23bb02022-03-09 14:09:14 -0800401 current_tp, current_tp + time::days(1));
tylerliu0b6d0db2020-09-28 17:52:02 -0700402 face.onSendData.connect([&](const Data& response) {
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700403 auto contentTlv = response.getContent();
404 contentTlv.parse();
tylerliu50d679e2020-10-14 14:08:39 -0700405 auto errorCode = static_cast<ErrorCode>(readNonNegativeInteger(contentTlv.get(tlv::ErrorCode)));
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700406 BOOST_CHECK(errorCode != ErrorCode::NO_ERROR);
tylerliu0b6d0db2020-09-28 17:52:02 -0700407 });
408 face.receive(*interest1);
409 face.receive(*interest2);
410
411 advanceClocks(time::milliseconds(20), 60);
412}
413
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700414BOOST_AUTO_TEST_CASE(HandleChallenge)
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800415{
Davide Pesavento829aff62022-05-15 20:30:34 -0400416 auto identity = m_keyChain.createIdentity(Name("/ndn"));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700417 auto key = identity.getDefaultKey();
418 auto cert = key.getDefaultCertificate();
419
Davide Pesavento76304d82023-08-10 23:38:06 -0400420 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700421 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800422 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700423
424 // generate NEW Interest
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700425 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800426 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500427 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800428 requester::Request state(m_keyChain, item, RequestType::NEW);
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700429
Davide Pesavento829aff62022-05-15 20:30:34 -0400430 auto newInterest = state.genNewInterest(m_keyChain.createIdentity(Name("/ndn/zhiyi")).getDefaultKey().getName(),
431 time::system_clock::now(),
432 time::system_clock::now() + time::days(1));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700433
434 // generate CHALLENGE Interest
Davide Pesavento0dc02012021-11-23 22:55:03 -0500435 std::shared_ptr<Interest> challengeInterest;
436 std::shared_ptr<Interest> challengeInterest2;
437 std::shared_ptr<Interest> challengeInterest3;
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800438
439 int count = 0;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700440 face.onSendData.connect([&](const Data& response) {
swa770de007bc2020-03-24 21:26:21 -0700441 if (Name("/ndn/CA/NEW").isPrefixOf(response.getName())) {
tylerliu4140fe82021-01-27 15:45:44 -0800442 auto challengeList = state.onNewRenewRevokeResponse(response);
443 auto paramList = state.selectOrContinueChallenge("pin");
444 challengeInterest = state.genChallengeInterest(std::move(paramList));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700445 }
swa770de007bc2020-03-24 21:26:21 -0700446 else if (Name("/ndn/CA/CHALLENGE").isPrefixOf(response.getName()) && count == 0) {
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800447 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500448 BOOST_CHECK(verifySignature(response, cert));
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800449
tylerliu4140fe82021-01-27 15:45:44 -0800450 state.onChallengeResponse(response);
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800451 BOOST_CHECK(state.m_status == Status::CHALLENGE);
452 BOOST_CHECK_EQUAL(state.m_challengeStatus, ChallengePin::NEED_CODE);
tylerliu4140fe82021-01-27 15:45:44 -0800453 auto paramList = state.selectOrContinueChallenge("pin");
454 challengeInterest2 = state.genChallengeInterest(std::move(paramList));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700455 }
swa770de007bc2020-03-24 21:26:21 -0700456 else if (Name("/ndn/CA/CHALLENGE").isPrefixOf(response.getName()) && count == 1) {
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700457 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500458 BOOST_CHECK(verifySignature(response, cert));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700459
tylerliu4140fe82021-01-27 15:45:44 -0800460 state.onChallengeResponse(response);
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800461 BOOST_CHECK(state.m_status == Status::CHALLENGE);
462 BOOST_CHECK_EQUAL(state.m_challengeStatus, ChallengePin::WRONG_CODE);
Davide Pesavento914d05f2019-07-13 16:20:19 -0400463
tylerliu4140fe82021-01-27 15:45:44 -0800464 auto paramList = state.selectOrContinueChallenge("pin");
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700465 auto request = ca.getCertificateRequest(*challengeInterest2);
tylerliu7b9185c2020-11-24 12:15:18 -0800466 auto secret = request->challengeState->secrets.get(ChallengePin::PARAMETER_KEY_CODE, "");
tylerliu40226332020-11-11 15:37:16 -0800467 paramList.begin()->second = secret;
tylerliu4140fe82021-01-27 15:45:44 -0800468 challengeInterest3 = state.genChallengeInterest(std::move(paramList));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700469 }
swa770de007bc2020-03-24 21:26:21 -0700470 else if (Name("/ndn/CA/CHALLENGE").isPrefixOf(response.getName()) && count == 2) {
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700471 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500472 BOOST_CHECK(verifySignature(response, cert));
tylerliu4140fe82021-01-27 15:45:44 -0800473 state.onChallengeResponse(response);
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800474 BOOST_CHECK(state.m_status == Status::SUCCESS);
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700475 }
Davide Pesavento914d05f2019-07-13 16:20:19 -0400476 });
Tianyuan Yue78fd4d2022-05-25 13:18:06 -0700477 ca.setStatusUpdateCallback([](const RequestState& request) {
478 if (request.status == Status::SUCCESS && request.requestType == RequestType::NEW) {
479 BOOST_REQUIRE_NO_THROW(Certificate{request.cert});
480 BOOST_CHECK(Certificate(request.cert).isValid());
481 }
482 });
Davide Pesavento914d05f2019-07-13 16:20:19 -0400483
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700484 face.receive(*newInterest);
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800485 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700486 face.receive(*challengeInterest);
487 advanceClocks(time::milliseconds(20), 60);
488 face.receive(*challengeInterest2);
489 advanceClocks(time::milliseconds(20), 60);
490 face.receive(*challengeInterest3);
491 advanceClocks(time::milliseconds(20), 60);
492 BOOST_CHECK_EQUAL(count, 3);
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800493}
494
tylerliu182bc532020-09-25 01:54:45 -0700495BOOST_AUTO_TEST_CASE(HandleRevoke)
496{
Davide Pesavento829aff62022-05-15 20:30:34 -0400497 auto identity = m_keyChain.createIdentity(Name("/ndn"));
tylerliu182bc532020-09-25 01:54:45 -0700498 auto key = identity.getDefaultKey();
499 auto cert = key.getDefaultCertificate();
500
Davide Pesavento76304d82023-08-10 23:38:06 -0400501 ndn::DummyClientFace face(m_io, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700502 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
tylerliu182bc532020-09-25 01:54:45 -0700503 advanceClocks(time::milliseconds(20), 60);
504
505 //generate a certificate
506 auto clientIdentity = m_keyChain.createIdentity("/ndn/qwerty");
507 auto clientKey = clientIdentity.getDefaultKey();
Davide Pesavento0dc02012021-11-23 22:55:03 -0500508 Certificate clientCert;
tylerliu182bc532020-09-25 01:54:45 -0700509 clientCert.setName(Name(clientKey.getName()).append("cert-request").appendVersion());
Zhiyi Zhang8f1ade32020-10-14 16:42:57 -0700510 clientCert.setContentType(ndn::tlv::ContentType_Key);
tylerliu182bc532020-09-25 01:54:45 -0700511 clientCert.setFreshnessPeriod(time::hours(24));
Davide Pesavento6f1a2ab2022-03-17 03:57:21 -0400512 clientCert.setContent(clientKey.getPublicKey());
tylerliu182bc532020-09-25 01:54:45 -0700513 SignatureInfo signatureInfo;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500514 signatureInfo.setValidityPeriod(ndn::security::ValidityPeriod(time::system_clock::now(),
515 time::system_clock::now() + time::hours(10)));
tylerliu182bc532020-09-25 01:54:45 -0700516 m_keyChain.sign(clientCert, signingByKey(clientKey.getName()).setSignatureInfo(signatureInfo));
Zhiyi Zhang1f5e86e2020-12-04 15:07:57 -0800517 RequestId requestId = {{101}};
518 RequestState certRequest;
519 certRequest.caPrefix = Name("/ndn");
520 certRequest.requestId = requestId;
521 certRequest.requestType = RequestType::NEW;
522 certRequest.status = Status::SUCCESS;
523 certRequest.cert = clientCert;
tylerliu182bc532020-09-25 01:54:45 -0700524 auto issuedCert = ca.issueCertificate(certRequest);
525
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700526 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800527 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500528 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800529 requester::Request state(m_keyChain, item, RequestType::REVOKE);
tylerliu182bc532020-09-25 01:54:45 -0700530
tylerliu4140fe82021-01-27 15:45:44 -0800531 auto interest = state.genRevokeInterest(issuedCert);
tylerliu182bc532020-09-25 01:54:45 -0700532
533 int count = 0;
Zhiyi Zhang46049832020-09-28 17:08:12 -0700534 face.onSendData.connect([&](const Data& response) {
tylerliu182bc532020-09-25 01:54:45 -0700535 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500536 BOOST_CHECK(verifySignature(response, cert));
tylerliu182bc532020-09-25 01:54:45 -0700537 auto contentBlock = response.getContent();
538 contentBlock.parse();
539
tylerliu50d679e2020-10-14 14:08:39 -0700540 BOOST_CHECK(readString(contentBlock.get(tlv::EcdhPub)) != "");
541 BOOST_CHECK(readString(contentBlock.get(tlv::Salt)) != "");
542 BOOST_CHECK(readString(contentBlock.get(tlv::RequestId)) != "");
tylerliu182bc532020-09-25 01:54:45 -0700543
544 auto challengeBlockCount = 0;
545 for (auto const& element : contentBlock.elements()) {
tylerliu50d679e2020-10-14 14:08:39 -0700546 if (element.type() == tlv::Challenge) {
Zhiyi Zhang46049832020-09-28 17:08:12 -0700547 challengeBlockCount++;
548 }
tylerliu182bc532020-09-25 01:54:45 -0700549 }
550
551 BOOST_CHECK(challengeBlockCount != 0);
552
tylerliu4140fe82021-01-27 15:45:44 -0800553 auto challengeList = state.onNewRenewRevokeResponse(response);
Zhiyi Zhangc9ada1b2020-10-29 19:13:15 -0700554 RequestId requestId;
Zhiyi Zhang8fdb36b2020-10-18 11:58:51 -0700555 std::memcpy(requestId.data(), contentBlock.get(tlv::RequestId).value(), contentBlock.get(tlv::RequestId).value_size());
tylerliu7b9185c2020-11-24 12:15:18 -0800556 auto ca_encryption_key = ca.getCaStorage()->getRequest(requestId).encryptionKey;
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800557 BOOST_CHECK_EQUAL_COLLECTIONS(state.m_aesKey.begin(), state.m_aesKey.end(),
Zhiyi Zhang1f9551b2020-10-30 10:30:43 -0700558 ca_encryption_key.begin(), ca_encryption_key.end());
tylerliu182bc532020-09-25 01:54:45 -0700559 });
560 face.receive(*interest);
561
562 advanceClocks(time::milliseconds(20), 60);
563 BOOST_CHECK_EQUAL(count, 1);
564}
565
566BOOST_AUTO_TEST_CASE(HandleRevokeWithBadCert)
567{
Davide Pesavento829aff62022-05-15 20:30:34 -0400568 auto identity = m_keyChain.createIdentity(Name("/ndn"));
tylerliu182bc532020-09-25 01:54:45 -0700569 auto key = identity.getDefaultKey();
570 auto cert = key.getDefaultCertificate();
571
Davide Pesavento76304d82023-08-10 23:38:06 -0400572 ndn::DummyClientFace face(m_io, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700573 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
tylerliu182bc532020-09-25 01:54:45 -0700574 advanceClocks(time::milliseconds(20), 60);
575
Zhiyi Zhang3e8ca252020-09-30 17:18:38 -0700576 // generate a certificate
tylerliu182bc532020-09-25 01:54:45 -0700577 auto clientIdentity = m_keyChain.createIdentity("/ndn/qwerty");
578 auto clientKey = clientIdentity.getDefaultKey();
Davide Pesavento0dc02012021-11-23 22:55:03 -0500579 Certificate clientCert;
580 clientCert.setName(Name(clientKey.getName()).append("NDNCERT").append("1473283247810732701"));
Zhiyi Zhang8f1ade32020-10-14 16:42:57 -0700581 clientCert.setContentType(ndn::tlv::ContentType_Key);
tylerliu182bc532020-09-25 01:54:45 -0700582 clientCert.setFreshnessPeriod(time::hours(24));
Davide Pesavento6f1a2ab2022-03-17 03:57:21 -0400583 clientCert.setContent(clientKey.getPublicKey());
tylerliu182bc532020-09-25 01:54:45 -0700584 SignatureInfo signatureInfo;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500585 signatureInfo.setValidityPeriod(ndn::security::ValidityPeriod(time::system_clock::now(),
586 time::system_clock::now() + time::hours(10)));
tylerliu182bc532020-09-25 01:54:45 -0700587 m_keyChain.sign(clientCert, signingByKey(clientKey.getName()).setSignatureInfo(signatureInfo));
588
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700589 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800590 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500591 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800592 requester::Request state(m_keyChain, item, RequestType::NEW);
tylerliu182bc532020-09-25 01:54:45 -0700593
tylerliu4140fe82021-01-27 15:45:44 -0800594 auto interest = state.genRevokeInterest(clientCert);
tylerliu182bc532020-09-25 01:54:45 -0700595
Zhiyi Zhang3e8ca252020-09-30 17:18:38 -0700596 bool receiveData = false;
Zhiyi Zhang46049832020-09-28 17:08:12 -0700597 face.onSendData.connect([&](const Data& response) {
Zhiyi Zhang3e8ca252020-09-30 17:18:38 -0700598 receiveData = true;
599 auto contentTlv = response.getContent();
600 contentTlv.parse();
tylerliu50d679e2020-10-14 14:08:39 -0700601 BOOST_CHECK(static_cast<ErrorCode>(readNonNegativeInteger(contentTlv.get(tlv::ErrorCode))) != ErrorCode::NO_ERROR);
tylerliu182bc532020-09-25 01:54:45 -0700602 });
603 face.receive(*interest);
604
605 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhang3e8ca252020-09-30 17:18:38 -0700606 BOOST_CHECK_EQUAL(receiveData, true);
tylerliu182bc532020-09-25 01:54:45 -0700607}
608
Davide Pesavento0dc02012021-11-23 22:55:03 -0500609BOOST_AUTO_TEST_SUITE_END() // TestCaModule
Zhiyi Zhangf5246c42017-01-26 09:39:20 -0800610
Davide Pesavento0d1d11c2022-04-11 22:11:34 -0400611} // namespace ndncert::tests