blob: 2eeb4db30256b47a3d662a491109e523fb300f84 [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 Yu050b3ea2025-03-13 15:20:34 -07003 * Copyright (c) 2017-2025, 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{
Tianyuan Yua721a4d2024-12-20 20:05:21 -080043 m_keyChain.createIdentity(Name("/ndn"));
Davide Pesavento76304d82023-08-10 23:38:06 -040044 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -070045 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhang44c6a352020-12-14 10:57:17 -080046 BOOST_CHECK_EQUAL(ca.getCaConf().caProfile.caPrefix, "/ndn");
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080047
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080048 advanceClocks(time::milliseconds(20), 60);
Davide Pesavento6866b902024-12-22 23:11:26 -050049 BOOST_CHECK_EQUAL(ca.m_registeredPrefixes.size(), 1); // removed local discovery registration
50 BOOST_CHECK_EQUAL(ca.m_interestFilters.size(), 5); // infoMeta, onProbe, onNew, onChallenge, onRevoke
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080051}
52
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070053BOOST_AUTO_TEST_CASE(HandleProfileFetching)
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070054{
Davide Pesavento829aff62022-05-15 20:30:34 -040055 auto identity = m_keyChain.createIdentity(Name("/ndn"));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070056 auto key = identity.getDefaultKey();
57 auto cert = key.getDefaultCertificate();
58
Davide Pesavento76304d82023-08-10 23:38:06 -040059 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -070060 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070061 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangcd57da82020-10-08 20:35:40 -070062 auto profileData = ca.getCaProfileData();
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070063
Davide Pesavento0dc02012021-11-23 22:55:03 -050064 Interest interest = ndn::MetadataObject::makeDiscoveryInterest(Name("/ndn/CA/INFO"));
65 std::shared_ptr<Interest> infoInterest = nullptr;
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070066
Zhiyi Zhang696cd042020-10-07 21:27:36 -070067 face.setInterestFilter(
Davide Pesavento0dc02012021-11-23 22:55:03 -050068 ndn::InterestFilter("/ndn/CA/INFO"),
Zhiyi Zhang696cd042020-10-07 21:27:36 -070069 [&](const auto&, const Interest& interest) {
Zhiyi Zhangcd57da82020-10-08 20:35:40 -070070 if (interest.getName() == profileData.getName()) {
71 face.put(profileData);
72 }
73 },
74 nullptr, nullptr);
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070075 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -070076
77 int count = 0;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070078 face.onSendData.connect([&](const Data& response) {
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070079 if (count == 0) {
80 count++;
81 auto block = response.getContent();
82 block.parse();
Davide Pesavento0dc02012021-11-23 22:55:03 -050083 infoInterest = std::make_shared<Interest>(Name(block.get(ndn::tlv::Name)).appendSegment(0));
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070084 }
85 else {
86 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -050087 BOOST_CHECK(verifySignature(response, cert));
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070088 auto contentBlock = response.getContent();
89 contentBlock.parse();
Zhiyi Zhangf22ae242020-11-17 10:51:15 -080090 auto caItem = infotlv::decodeDataContent(contentBlock);
Zhiyi Zhang44c6a352020-12-14 10:57:17 -080091 BOOST_CHECK_EQUAL(caItem.caPrefix, "/ndn");
92 BOOST_CHECK_EQUAL(caItem.probeParameterKeys.size(), 1);
93 BOOST_CHECK_EQUAL(caItem.probeParameterKeys.front(), "full name");
94 BOOST_CHECK_EQUAL(caItem.cert->wireEncode(), cert.wireEncode());
95 BOOST_CHECK_EQUAL(caItem.caInfo, "ndn testbed ca");
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070096 }
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070097 });
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080098 face.receive(interest);
Zhiyi Zhangf5246c42017-01-26 09:39:20 -080099 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangfbcab842020-10-07 15:17:13 -0700100 face.receive(*infoInterest);
101 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangcd57da82020-10-08 20:35:40 -0700102
Zhiyi Zhangfbcab842020-10-07 15:17:13 -0700103 BOOST_CHECK_EQUAL(count, 2);
Zhiyi Zhangf5246c42017-01-26 09:39:20 -0800104}
105
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700106BOOST_AUTO_TEST_CASE(HandleProbe)
107{
Davide Pesavento829aff62022-05-15 20:30:34 -0400108 auto identity = m_keyChain.createIdentity(Name("/ndn"));
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700109 auto key = identity.getDefaultKey();
110 auto cert = key.getDefaultCertificate();
111
Davide Pesavento76304d82023-08-10 23:38:06 -0400112 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700113 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700114 advanceClocks(time::milliseconds(20), 60);
115
116 Interest interest("/ndn/CA/PROBE");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500117 Block paramTLV = ndn::makeEmptyBlock(ndn::tlv::ApplicationParameters);
118 paramTLV.push_back(ndn::makeStringBlock(tlv::ParameterKey, "name"));
119 paramTLV.push_back(ndn::makeStringBlock(tlv::ParameterValue, "zhiyi"));
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700120 paramTLV.encode();
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700121 interest.setApplicationParameters(paramTLV);
122
123 int count = 0;
124 face.onSendData.connect([&](const Data& response) {
125 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500126 BOOST_CHECK(verifySignature(response, cert));
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700127 Block contentBlock = response.getContent();
128 contentBlock.parse();
tylerliu50d679e2020-10-14 14:08:39 -0700129 Block probeResponse = contentBlock.get(tlv::ProbeResponse);
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700130 probeResponse.parse();
131 Name caName;
Zhiyi Zhang8f1ade32020-10-14 16:42:57 -0700132 caName.wireDecode(probeResponse.get(ndn::tlv::Name));
Zhiyi Zhang8683ec92020-10-07 18:18:35 -0700133 BOOST_CHECK_EQUAL(caName.size(), 2);
Zhiyi Zhang6f395812020-09-29 14:42:03 -0700134 });
135 face.receive(interest);
136
137 advanceClocks(time::milliseconds(20), 60);
138 BOOST_CHECK_EQUAL(count, 1);
139}
140
Zhiyi Zhanga63b7372017-05-17 14:14:34 -0700141BOOST_AUTO_TEST_CASE(HandleProbeUsingDefaultHandler)
142{
Davide Pesavento829aff62022-05-15 20:30:34 -0400143 auto identity = m_keyChain.createIdentity(Name("/ndn"));
Zhiyi Zhanga63b7372017-05-17 14:14:34 -0700144 auto key = identity.getDefaultKey();
145 auto cert = key.getDefaultCertificate();
146
Davide Pesavento76304d82023-08-10 23:38:06 -0400147 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700148 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhanga63b7372017-05-17 14:14:34 -0700149 advanceClocks(time::milliseconds(20), 60);
150
swa770de007bc2020-03-24 21:26:21 -0700151 Interest interest("/ndn/CA/PROBE");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500152 Block paramTLV = ndn::makeEmptyBlock(ndn::tlv::ApplicationParameters);
153 paramTLV.push_back(ndn::makeStringBlock(tlv::ParameterKey, "name"));
154 paramTLV.push_back(ndn::makeStringBlock(tlv::ParameterValue, "zhiyi"));
Suyong Won7968f7a2020-05-12 01:01:25 -0700155 paramTLV.encode();
Suyong Won7968f7a2020-05-12 01:01:25 -0700156 interest.setApplicationParameters(paramTLV);
Zhiyi Zhanga63b7372017-05-17 14:14:34 -0700157
158 int count = 0;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700159 face.onSendData.connect([&](const Data& response) {
160 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500161 BOOST_CHECK(verifySignature(response, cert));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700162 auto contentBlock = response.getContent();
163 contentBlock.parse();
tylerliu50d679e2020-10-14 14:08:39 -0700164 auto probeResponseBlock = contentBlock.get(tlv::ProbeResponse);
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700165 probeResponseBlock.parse();
166 Name caPrefix;
Zhiyi Zhang8f1ade32020-10-14 16:42:57 -0700167 caPrefix.wireDecode(probeResponseBlock.get(ndn::tlv::Name));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700168 BOOST_CHECK(caPrefix != "");
169 });
Zhiyi Zhanga63b7372017-05-17 14:14:34 -0700170 face.receive(interest);
171
172 advanceClocks(time::milliseconds(20), 60);
173 BOOST_CHECK_EQUAL(count, 1);
174}
175
Suyong Wone2afeb52020-10-04 03:05:39 +0900176BOOST_AUTO_TEST_CASE(HandleProbeRedirection)
177{
Davide Pesavento829aff62022-05-15 20:30:34 -0400178 auto identity = m_keyChain.createIdentity(Name("/ndn"));
Suyong Wone2afeb52020-10-04 03:05:39 +0900179 auto key = identity.getDefaultKey();
180 auto cert = key.getDefaultCertificate();
181
Davide Pesavento76304d82023-08-10 23:38:06 -0400182 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Suyong Wone2afeb52020-10-04 03:05:39 +0900183 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-5", "ca-storage-memory");
Suyong Wone2afeb52020-10-04 03:05:39 +0900184 advanceClocks(time::milliseconds(20), 60);
185
186 Interest interest("/ndn/CA/PROBE");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500187 Block paramTLV = ndn::makeEmptyBlock(ndn::tlv::ApplicationParameters);
188 paramTLV.push_back(ndn::makeStringBlock(tlv::ParameterKey, "name"));
189 paramTLV.push_back(ndn::makeStringBlock(tlv::ParameterValue, "zhiyi"));
Suyong Wone2afeb52020-10-04 03:05:39 +0900190 paramTLV.encode();
Suyong Wone2afeb52020-10-04 03:05:39 +0900191 interest.setApplicationParameters(paramTLV);
192
193 int count = 0;
194 face.onSendData.connect([&](const Data& response) {
195 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500196 BOOST_CHECK(verifySignature(response, cert));
Suyong Wone2afeb52020-10-04 03:05:39 +0900197 Block contentBlock = response.getContent();
198 contentBlock.parse();
199
200 // Test CA sent redirections
Zhiyi Zhang34a8d432020-10-03 22:14:25 -0700201 std::vector<Name> redirectionItems;
202 for (auto item : contentBlock.elements()) {
tylerliu50d679e2020-10-14 14:08:39 -0700203 if (item.type() == tlv::ProbeRedirect) {
Zhiyi Zhang34a8d432020-10-03 22:14:25 -0700204 redirectionItems.push_back(Name(item.blockFromValue()));
205 }
Suyong Wone2afeb52020-10-04 03:05:39 +0900206 }
Zhiyi Zhang34a8d432020-10-03 22:14:25 -0700207 BOOST_CHECK_EQUAL(redirectionItems.size(), 2);
Tianyuan Yu13aac732022-03-03 20:59:54 -0800208 BOOST_CHECK_EQUAL(ndn::security::extractIdentityFromCertName(redirectionItems[0].getPrefix(-1)), "/ndn/edu/ucla");
209 BOOST_CHECK_EQUAL(ndn::security::extractIdentityFromCertName(redirectionItems[1].getPrefix(-1)), "/ndn/edu/ucla/cs/irl");
Suyong Wone2afeb52020-10-04 03:05:39 +0900210 });
211 face.receive(interest);
212 advanceClocks(time::milliseconds(20), 60);
213 BOOST_CHECK_EQUAL(count, 1);
214}
215
Zhiyi Zhangf5246c42017-01-26 09:39:20 -0800216BOOST_AUTO_TEST_CASE(HandleNew)
217{
Davide Pesavento829aff62022-05-15 20:30:34 -0400218 auto identity = m_keyChain.createIdentity(Name("/ndn"));
Zhiyi Zhangf5246c42017-01-26 09:39:20 -0800219 auto key = identity.getDefaultKey();
220 auto cert = key.getDefaultCertificate();
221
Davide Pesavento76304d82023-08-10 23:38:06 -0400222 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700223 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhangf5246c42017-01-26 09:39:20 -0800224 advanceClocks(time::milliseconds(20), 60);
225
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700226 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800227 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500228 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800229 requester::Request state(m_keyChain, item, RequestType::NEW);
Davide Pesavento829aff62022-05-15 20:30:34 -0400230 auto interest = state.genNewInterest(m_keyChain.createIdentity(Name("/ndn/zhiyi")).getDefaultKey().getName(),
tylerliu4140fe82021-01-27 15:45:44 -0800231 time::system_clock::now(),
232 time::system_clock::now() + time::days(1));
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800233
234 int count = 0;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700235 face.onSendData.connect([&](const Data& response) {
236 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500237 BOOST_CHECK(verifySignature(response, cert));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700238 auto contentBlock = response.getContent();
239 contentBlock.parse();
Suyong Won7968f7a2020-05-12 01:01:25 -0700240
tylerliu50d679e2020-10-14 14:08:39 -0700241 BOOST_CHECK(readString(contentBlock.get(tlv::EcdhPub)) != "");
242 BOOST_CHECK(readString(contentBlock.get(tlv::Salt)) != "");
243 BOOST_CHECK(readString(contentBlock.get(tlv::RequestId)) != "");
Suyong Won7968f7a2020-05-12 01:01:25 -0700244
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700245 auto challengeBlockCount = 0;
246 for (auto const& element : contentBlock.elements()) {
tylerliu50d679e2020-10-14 14:08:39 -0700247 if (element.type() == tlv::Challenge) {
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700248 challengeBlockCount++;
Suyong Won7968f7a2020-05-12 01:01:25 -0700249 }
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700250 }
Suyong Won7968f7a2020-05-12 01:01:25 -0700251
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700252 BOOST_CHECK(challengeBlockCount != 0);
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700253
tylerliu4140fe82021-01-27 15:45:44 -0800254 auto challengeList = state.onNewRenewRevokeResponse(response);
Zhiyi Zhangc9ada1b2020-10-29 19:13:15 -0700255 RequestId requestId;
Zhiyi Zhang8fdb36b2020-10-18 11:58:51 -0700256 std::memcpy(requestId.data(), contentBlock.get(tlv::RequestId).value(), contentBlock.get(tlv::RequestId).value_size());
tylerliu7b9185c2020-11-24 12:15:18 -0800257 auto ca_encryption_key = ca.getCaStorage()->getRequest(requestId).encryptionKey;
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800258 BOOST_CHECK_EQUAL_COLLECTIONS(state.m_aesKey.begin(), state.m_aesKey.end(),
Zhiyi Zhang1f9551b2020-10-30 10:30:43 -0700259 ca_encryption_key.begin(), ca_encryption_key.end());
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700260 });
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700261 face.receive(*interest);
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800262
263 advanceClocks(time::milliseconds(20), 60);
264 BOOST_CHECK_EQUAL(count, 1);
265}
266
Tianyuan Yu050b3ea2025-03-13 15:20:34 -0700267BOOST_AUTO_TEST_CASE(HandleNewWithInvalidValidityPeriod)
Zhiyi Zhang1a735bc2019-07-04 21:36:49 -0700268{
Davide Pesavento829aff62022-05-15 20:30:34 -0400269 auto identity = m_keyChain.createIdentity(Name("/ndn"));
Zhiyi Zhang1a735bc2019-07-04 21:36:49 -0700270 auto key = identity.getDefaultKey();
271 auto cert = key.getDefaultCertificate();
272
Davide Pesavento76304d82023-08-10 23:38:06 -0400273 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700274 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1");
Tianyuan Yu050b3ea2025-03-13 15:20:34 -0700275 advanceClocks(20_ms, 60);
Zhiyi Zhang1a735bc2019-07-04 21:36:49 -0700276
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700277 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800278 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500279 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800280 requester::Request state(m_keyChain, item, RequestType::NEW);
Davide Pesavento829aff62022-05-15 20:30:34 -0400281 auto client = m_keyChain.createIdentity(Name("/ndn/zhiyi"));
Tianyuan Yu050b3ea2025-03-13 15:20:34 -0700282
283 // max-validity-period is 10 days
284 auto now = time::system_clock::now();
285 auto interest1 = state.genNewInterest(client.getDefaultKey().getName(), now, now - 1_h);
286 auto interest2 = state.genNewInterest(client.getDefaultKey().getName(), now, now + 11_days);
287 auto interest3 = state.genNewInterest(client.getDefaultKey().getName(), now - 3_min, now + 1_day);
288 auto interest4 = state.genNewInterest(client.getDefaultKey().getName(), now + 1_day, now + 10_days + 3_min);
289 auto interest5 = state.genNewInterest(client.getDefaultKey().getName(), now - 1_min, now + 10_days + 1_min);
290
291 int count = 0;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700292 face.onSendData.connect([&](const Data& response) {
Tianyuan Yu050b3ea2025-03-13 15:20:34 -0700293 ++count;
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700294 auto contentTlv = response.getContent();
295 contentTlv.parse();
Tianyuan Yu050b3ea2025-03-13 15:20:34 -0700296 auto err = ndn::readNonNegativeIntegerAs<ErrorCode>(contentTlv.get(tlv::ErrorCode));
297 BOOST_TEST(err == ErrorCode::BAD_VALIDITY_PERIOD);
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700298 });
Zhiyi Zhang1a735bc2019-07-04 21:36:49 -0700299 face.receive(*interest1);
300 face.receive(*interest2);
301 face.receive(*interest3);
Tianyuan Yu050b3ea2025-03-13 15:20:34 -0700302 face.receive(*interest4);
303 face.receive(*interest5);
Zhiyi Zhang1a735bc2019-07-04 21:36:49 -0700304
Tianyuan Yu050b3ea2025-03-13 15:20:34 -0700305 advanceClocks(20_ms, 60);
306 BOOST_TEST(count == 5);
Zhiyi Zhang1a735bc2019-07-04 21:36:49 -0700307}
308
tylerliuf62cfeb2021-01-28 11:01:33 -0800309BOOST_AUTO_TEST_CASE(HandleNewWithServerBadValidity)
310{
Davide Pesavento829aff62022-05-15 20:30:34 -0400311 auto identity = m_keyChain.createIdentity(Name("/ndn"));
tylerliuf62cfeb2021-01-28 11:01:33 -0800312 auto key = identity.getDefaultKey();
313
Tianyuan Yu050b3ea2025-03-13 15:20:34 -0700314 // build expired cert
Davide Pesavento0dc02012021-11-23 22:55:03 -0500315 Certificate cert;
tylerliuf62cfeb2021-01-28 11:01:33 -0800316 cert.setName(Name(key.getName()).append("self-sign").appendVersion());
317 cert.setContentType(ndn::tlv::ContentType_Key);
Davide Pesavento6f1a2ab2022-03-17 03:57:21 -0400318 cert.setContent(key.getPublicKey());
tylerliuf62cfeb2021-01-28 11:01:33 -0800319 SignatureInfo signatureInfo;
Davide Pesavento829aff62022-05-15 20:30:34 -0400320 signatureInfo.setValidityPeriod(ndn::security::ValidityPeriod::makeRelative(-1_days, -1_s));
tylerliuf62cfeb2021-01-28 11:01:33 -0800321 m_keyChain.sign(cert, signingByKey(key.getName()).setSignatureInfo(signatureInfo));
322 m_keyChain.setDefaultCertificate(key, cert);
323
Davide Pesavento76304d82023-08-10 23:38:06 -0400324 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
tylerliuf62cfeb2021-01-28 11:01:33 -0800325 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
326 advanceClocks(time::milliseconds(20), 60);
327
328 CaProfile item;
329 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500330 item.cert = std::make_shared<Certificate>(cert);
tylerliuf62cfeb2021-01-28 11:01:33 -0800331 requester::Request state(m_keyChain, item, RequestType::NEW);
Davide Pesavento829aff62022-05-15 20:30:34 -0400332 auto interest = state.genNewInterest(m_keyChain.createIdentity(Name("/ndn/zhiyi")).getDefaultKey().getName(),
tylerliuf62cfeb2021-01-28 11:01:33 -0800333 time::system_clock::now(),
334 time::system_clock::now() + time::days(1));
335
336 int count = 0;
337 face.onSendData.connect([&](const Data& response) {
338 auto contentTlv = response.getContent();
339 contentTlv.parse();
340 auto errorCode = static_cast<ErrorCode>(readNonNegativeInteger(contentTlv.get(tlv::ErrorCode)));
341 BOOST_CHECK(errorCode != ErrorCode::NO_ERROR);
342 count ++;
343 });
344 face.receive(*interest);
345
346 advanceClocks(time::milliseconds(20), 60);
347 BOOST_CHECK_EQUAL(count, 1);
348}
349
tylerliu0b6d0db2020-09-28 17:52:02 -0700350BOOST_AUTO_TEST_CASE(HandleNewWithLongSuffix)
351{
Davide Pesavento829aff62022-05-15 20:30:34 -0400352 auto identity = m_keyChain.createIdentity(Name("/ndn"));
tylerliu0b6d0db2020-09-28 17:52:02 -0700353 auto key = identity.getDefaultKey();
354 auto cert = key.getDefaultCertificate();
355
Davide Pesavento76304d82023-08-10 23:38:06 -0400356 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700357 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
tylerliu0b6d0db2020-09-28 17:52:02 -0700358 advanceClocks(time::milliseconds(20), 60);
359
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700360 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800361 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500362 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800363 requester::Request state(m_keyChain, item, RequestType::NEW);
tylerliu0b6d0db2020-09-28 17:52:02 -0700364
Davide Pesavento829aff62022-05-15 20:30:34 -0400365 auto interest1 = state.genNewInterest(m_keyChain.createIdentity(Name("/ndn/a")).getDefaultKey().getName(),
366 time::system_clock::now(),
367 time::system_clock::now() + time::days(1));
368 auto interest2 = state.genNewInterest(m_keyChain.createIdentity(Name("/ndn/a/b")).getDefaultKey().getName(),
369 time::system_clock::now(),
370 time::system_clock::now() + time::days(1));
371 auto interest3 = state.genNewInterest(m_keyChain.createIdentity(Name("/ndn/a/b/c/d")).getDefaultKey().getName(),
372 time::system_clock::now(),
373 time::system_clock::now() + time::days(1));
tylerliu0b6d0db2020-09-28 17:52:02 -0700374
tylerliu0b6d0db2020-09-28 17:52:02 -0700375 face.onSendData.connect([&](const Data& response) {
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700376 auto contentTlv = response.getContent();
377 contentTlv.parse();
378 if (interest3->getName().isPrefixOf(response.getName())) {
tylerliu50d679e2020-10-14 14:08:39 -0700379 auto errorCode = static_cast<ErrorCode>(readNonNegativeInteger(contentTlv.get(tlv::ErrorCode)));
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700380 BOOST_CHECK(errorCode != ErrorCode::NO_ERROR);
381 }
382 else {
383 // should successfully get responses
Davide Pesavento0dc02012021-11-23 22:55:03 -0500384 BOOST_CHECK_THROW(readNonNegativeInteger(contentTlv.get(tlv::ErrorCode)), std::runtime_error);
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700385 }
tylerliu0b6d0db2020-09-28 17:52:02 -0700386 });
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700387 face.receive(*interest1);
388 face.receive(*interest2);
389 face.receive(*interest3);
tylerliu0b6d0db2020-09-28 17:52:02 -0700390 advanceClocks(time::milliseconds(20), 60);
tylerliu0b6d0db2020-09-28 17:52:02 -0700391}
392
tylerliu0b6d0db2020-09-28 17:52:02 -0700393BOOST_AUTO_TEST_CASE(HandleNewWithInvalidLength1)
394{
Davide Pesavento829aff62022-05-15 20:30:34 -0400395 auto identity = m_keyChain.createIdentity(Name("/ndn"));
tylerliu0b6d0db2020-09-28 17:52:02 -0700396 auto key = identity.getDefaultKey();
397 auto cert = key.getDefaultCertificate();
398
Davide Pesavento76304d82023-08-10 23:38:06 -0400399 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700400 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1");
tylerliu0b6d0db2020-09-28 17:52:02 -0700401 advanceClocks(time::milliseconds(20), 60);
402
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700403 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800404 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500405 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800406 requester::Request state(m_keyChain, item, RequestType::NEW);
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700407
tylerliu0b6d0db2020-09-28 17:52:02 -0700408 auto current_tp = time::system_clock::now();
Tianyuan Yuca23bb02022-03-09 14:09:14 -0800409 auto interest1 = state.genNewInterest(identity.getDefaultKey().getName(), current_tp, current_tp + time::days(1));
Davide Pesavento829aff62022-05-15 20:30:34 -0400410 auto interest2 = state.genNewInterest(m_keyChain.createIdentity(Name("/ndn/a/b/c/d")).getDefaultKey().getName(),
Tianyuan Yuca23bb02022-03-09 14:09:14 -0800411 current_tp, current_tp + time::days(1));
tylerliu0b6d0db2020-09-28 17:52:02 -0700412 face.onSendData.connect([&](const Data& response) {
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700413 auto contentTlv = response.getContent();
414 contentTlv.parse();
tylerliu50d679e2020-10-14 14:08:39 -0700415 auto errorCode = static_cast<ErrorCode>(readNonNegativeInteger(contentTlv.get(tlv::ErrorCode)));
Zhiyi Zhang01e91a32020-09-29 12:10:00 -0700416 BOOST_CHECK(errorCode != ErrorCode::NO_ERROR);
tylerliu0b6d0db2020-09-28 17:52:02 -0700417 });
418 face.receive(*interest1);
419 face.receive(*interest2);
420
421 advanceClocks(time::milliseconds(20), 60);
422}
423
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700424BOOST_AUTO_TEST_CASE(HandleChallenge)
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800425{
Davide Pesavento829aff62022-05-15 20:30:34 -0400426 auto identity = m_keyChain.createIdentity(Name("/ndn"));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700427 auto key = identity.getDefaultKey();
428 auto cert = key.getDefaultCertificate();
429
Davide Pesavento76304d82023-08-10 23:38:06 -0400430 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700431 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800432 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700433
434 // generate NEW Interest
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700435 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800436 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500437 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800438 requester::Request state(m_keyChain, item, RequestType::NEW);
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700439
Davide Pesavento829aff62022-05-15 20:30:34 -0400440 auto newInterest = state.genNewInterest(m_keyChain.createIdentity(Name("/ndn/zhiyi")).getDefaultKey().getName(),
441 time::system_clock::now(),
442 time::system_clock::now() + time::days(1));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700443
444 // generate CHALLENGE Interest
Davide Pesavento0dc02012021-11-23 22:55:03 -0500445 std::shared_ptr<Interest> challengeInterest;
446 std::shared_ptr<Interest> challengeInterest2;
447 std::shared_ptr<Interest> challengeInterest3;
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800448
449 int count = 0;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700450 face.onSendData.connect([&](const Data& response) {
swa770de007bc2020-03-24 21:26:21 -0700451 if (Name("/ndn/CA/NEW").isPrefixOf(response.getName())) {
tylerliu4140fe82021-01-27 15:45:44 -0800452 auto challengeList = state.onNewRenewRevokeResponse(response);
453 auto paramList = state.selectOrContinueChallenge("pin");
454 challengeInterest = 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 == 0) {
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800457 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500458 BOOST_CHECK(verifySignature(response, cert));
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800459
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::NEED_CODE);
tylerliu4140fe82021-01-27 15:45:44 -0800463 auto paramList = state.selectOrContinueChallenge("pin");
464 challengeInterest2 = state.genChallengeInterest(std::move(paramList));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700465 }
swa770de007bc2020-03-24 21:26:21 -0700466 else if (Name("/ndn/CA/CHALLENGE").isPrefixOf(response.getName()) && count == 1) {
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700467 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500468 BOOST_CHECK(verifySignature(response, cert));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700469
tylerliu4140fe82021-01-27 15:45:44 -0800470 state.onChallengeResponse(response);
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800471 BOOST_CHECK(state.m_status == Status::CHALLENGE);
472 BOOST_CHECK_EQUAL(state.m_challengeStatus, ChallengePin::WRONG_CODE);
Davide Pesavento914d05f2019-07-13 16:20:19 -0400473
tylerliu4140fe82021-01-27 15:45:44 -0800474 auto paramList = state.selectOrContinueChallenge("pin");
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700475 auto request = ca.getCertificateRequest(*challengeInterest2);
tylerliu7b9185c2020-11-24 12:15:18 -0800476 auto secret = request->challengeState->secrets.get(ChallengePin::PARAMETER_KEY_CODE, "");
tylerliu40226332020-11-11 15:37:16 -0800477 paramList.begin()->second = secret;
tylerliu4140fe82021-01-27 15:45:44 -0800478 challengeInterest3 = state.genChallengeInterest(std::move(paramList));
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700479 }
swa770de007bc2020-03-24 21:26:21 -0700480 else if (Name("/ndn/CA/CHALLENGE").isPrefixOf(response.getName()) && count == 2) {
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700481 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500482 BOOST_CHECK(verifySignature(response, cert));
tylerliu4140fe82021-01-27 15:45:44 -0800483 state.onChallengeResponse(response);
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800484 BOOST_CHECK(state.m_status == Status::SUCCESS);
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700485 }
Davide Pesavento914d05f2019-07-13 16:20:19 -0400486 });
Tianyuan Yue78fd4d2022-05-25 13:18:06 -0700487 ca.setStatusUpdateCallback([](const RequestState& request) {
488 if (request.status == Status::SUCCESS && request.requestType == RequestType::NEW) {
489 BOOST_REQUIRE_NO_THROW(Certificate{request.cert});
490 BOOST_CHECK(Certificate(request.cert).isValid());
491 }
492 });
Davide Pesavento914d05f2019-07-13 16:20:19 -0400493
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700494 face.receive(*newInterest);
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800495 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -0700496 face.receive(*challengeInterest);
497 advanceClocks(time::milliseconds(20), 60);
498 face.receive(*challengeInterest2);
499 advanceClocks(time::milliseconds(20), 60);
500 face.receive(*challengeInterest3);
501 advanceClocks(time::milliseconds(20), 60);
502 BOOST_CHECK_EQUAL(count, 3);
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800503}
504
tylerliu182bc532020-09-25 01:54:45 -0700505BOOST_AUTO_TEST_CASE(HandleRevoke)
506{
Davide Pesavento829aff62022-05-15 20:30:34 -0400507 auto identity = m_keyChain.createIdentity(Name("/ndn"));
tylerliu182bc532020-09-25 01:54:45 -0700508 auto key = identity.getDefaultKey();
509 auto cert = key.getDefaultCertificate();
510
Tianyuan Yua721a4d2024-12-20 20:05:21 -0800511 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700512 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
tylerliu182bc532020-09-25 01:54:45 -0700513 advanceClocks(time::milliseconds(20), 60);
514
515 //generate a certificate
516 auto clientIdentity = m_keyChain.createIdentity("/ndn/qwerty");
517 auto clientKey = clientIdentity.getDefaultKey();
Davide Pesavento0dc02012021-11-23 22:55:03 -0500518 Certificate clientCert;
tylerliu182bc532020-09-25 01:54:45 -0700519 clientCert.setName(Name(clientKey.getName()).append("cert-request").appendVersion());
Zhiyi Zhang8f1ade32020-10-14 16:42:57 -0700520 clientCert.setContentType(ndn::tlv::ContentType_Key);
tylerliu182bc532020-09-25 01:54:45 -0700521 clientCert.setFreshnessPeriod(time::hours(24));
Davide Pesavento6f1a2ab2022-03-17 03:57:21 -0400522 clientCert.setContent(clientKey.getPublicKey());
tylerliu182bc532020-09-25 01:54:45 -0700523 SignatureInfo signatureInfo;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500524 signatureInfo.setValidityPeriod(ndn::security::ValidityPeriod(time::system_clock::now(),
525 time::system_clock::now() + time::hours(10)));
tylerliu182bc532020-09-25 01:54:45 -0700526 m_keyChain.sign(clientCert, signingByKey(clientKey.getName()).setSignatureInfo(signatureInfo));
Zhiyi Zhang1f5e86e2020-12-04 15:07:57 -0800527 RequestId requestId = {{101}};
528 RequestState certRequest;
529 certRequest.caPrefix = Name("/ndn");
530 certRequest.requestId = requestId;
531 certRequest.requestType = RequestType::NEW;
532 certRequest.status = Status::SUCCESS;
533 certRequest.cert = clientCert;
tylerliu182bc532020-09-25 01:54:45 -0700534 auto issuedCert = ca.issueCertificate(certRequest);
535
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700536 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800537 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500538 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800539 requester::Request state(m_keyChain, item, RequestType::REVOKE);
tylerliu182bc532020-09-25 01:54:45 -0700540
tylerliu4140fe82021-01-27 15:45:44 -0800541 auto interest = state.genRevokeInterest(issuedCert);
tylerliu182bc532020-09-25 01:54:45 -0700542
543 int count = 0;
Zhiyi Zhang46049832020-09-28 17:08:12 -0700544 face.onSendData.connect([&](const Data& response) {
tylerliu182bc532020-09-25 01:54:45 -0700545 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500546 BOOST_CHECK(verifySignature(response, cert));
tylerliu182bc532020-09-25 01:54:45 -0700547 auto contentBlock = response.getContent();
548 contentBlock.parse();
549
tylerliu50d679e2020-10-14 14:08:39 -0700550 BOOST_CHECK(readString(contentBlock.get(tlv::EcdhPub)) != "");
551 BOOST_CHECK(readString(contentBlock.get(tlv::Salt)) != "");
552 BOOST_CHECK(readString(contentBlock.get(tlv::RequestId)) != "");
tylerliu182bc532020-09-25 01:54:45 -0700553
554 auto challengeBlockCount = 0;
555 for (auto const& element : contentBlock.elements()) {
tylerliu50d679e2020-10-14 14:08:39 -0700556 if (element.type() == tlv::Challenge) {
Zhiyi Zhang46049832020-09-28 17:08:12 -0700557 challengeBlockCount++;
558 }
tylerliu182bc532020-09-25 01:54:45 -0700559 }
560
561 BOOST_CHECK(challengeBlockCount != 0);
562
tylerliu4140fe82021-01-27 15:45:44 -0800563 auto challengeList = state.onNewRenewRevokeResponse(response);
Zhiyi Zhangc9ada1b2020-10-29 19:13:15 -0700564 RequestId requestId;
Zhiyi Zhang8fdb36b2020-10-18 11:58:51 -0700565 std::memcpy(requestId.data(), contentBlock.get(tlv::RequestId).value(), contentBlock.get(tlv::RequestId).value_size());
tylerliu7b9185c2020-11-24 12:15:18 -0800566 auto ca_encryption_key = ca.getCaStorage()->getRequest(requestId).encryptionKey;
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800567 BOOST_CHECK_EQUAL_COLLECTIONS(state.m_aesKey.begin(), state.m_aesKey.end(),
Zhiyi Zhang1f9551b2020-10-30 10:30:43 -0700568 ca_encryption_key.begin(), ca_encryption_key.end());
tylerliu182bc532020-09-25 01:54:45 -0700569 });
570 face.receive(*interest);
571
572 advanceClocks(time::milliseconds(20), 60);
573 BOOST_CHECK_EQUAL(count, 1);
574}
575
576BOOST_AUTO_TEST_CASE(HandleRevokeWithBadCert)
577{
Davide Pesavento829aff62022-05-15 20:30:34 -0400578 auto identity = m_keyChain.createIdentity(Name("/ndn"));
tylerliu182bc532020-09-25 01:54:45 -0700579 auto key = identity.getDefaultKey();
580 auto cert = key.getDefaultCertificate();
581
Tianyuan Yua721a4d2024-12-20 20:05:21 -0800582 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang9829da92020-09-30 16:19:34 -0700583 CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
tylerliu182bc532020-09-25 01:54:45 -0700584 advanceClocks(time::milliseconds(20), 60);
585
Zhiyi Zhang3e8ca252020-09-30 17:18:38 -0700586 // generate a certificate
tylerliu182bc532020-09-25 01:54:45 -0700587 auto clientIdentity = m_keyChain.createIdentity("/ndn/qwerty");
588 auto clientKey = clientIdentity.getDefaultKey();
Davide Pesavento0dc02012021-11-23 22:55:03 -0500589 Certificate clientCert;
590 clientCert.setName(Name(clientKey.getName()).append("NDNCERT").append("1473283247810732701"));
Zhiyi Zhang8f1ade32020-10-14 16:42:57 -0700591 clientCert.setContentType(ndn::tlv::ContentType_Key);
tylerliu182bc532020-09-25 01:54:45 -0700592 clientCert.setFreshnessPeriod(time::hours(24));
Davide Pesavento6f1a2ab2022-03-17 03:57:21 -0400593 clientCert.setContent(clientKey.getPublicKey());
tylerliu182bc532020-09-25 01:54:45 -0700594 SignatureInfo signatureInfo;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500595 signatureInfo.setValidityPeriod(ndn::security::ValidityPeriod(time::system_clock::now(),
596 time::system_clock::now() + time::hours(10)));
tylerliu182bc532020-09-25 01:54:45 -0700597 m_keyChain.sign(clientCert, signingByKey(clientKey.getName()).setSignatureInfo(signatureInfo));
598
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700599 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800600 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500601 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800602 requester::Request state(m_keyChain, item, RequestType::NEW);
tylerliu182bc532020-09-25 01:54:45 -0700603
tylerliu4140fe82021-01-27 15:45:44 -0800604 auto interest = state.genRevokeInterest(clientCert);
tylerliu182bc532020-09-25 01:54:45 -0700605
Zhiyi Zhang3e8ca252020-09-30 17:18:38 -0700606 bool receiveData = false;
Zhiyi Zhang46049832020-09-28 17:08:12 -0700607 face.onSendData.connect([&](const Data& response) {
Zhiyi Zhang3e8ca252020-09-30 17:18:38 -0700608 receiveData = true;
609 auto contentTlv = response.getContent();
610 contentTlv.parse();
tylerliu50d679e2020-10-14 14:08:39 -0700611 BOOST_CHECK(static_cast<ErrorCode>(readNonNegativeInteger(contentTlv.get(tlv::ErrorCode))) != ErrorCode::NO_ERROR);
tylerliu182bc532020-09-25 01:54:45 -0700612 });
613 face.receive(*interest);
614
615 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhang3e8ca252020-09-30 17:18:38 -0700616 BOOST_CHECK_EQUAL(receiveData, true);
tylerliu182bc532020-09-25 01:54:45 -0700617}
618
Davide Pesavento0dc02012021-11-23 22:55:03 -0500619BOOST_AUTO_TEST_SUITE_END() // TestCaModule
Zhiyi Zhangf5246c42017-01-26 09:39:20 -0800620
Davide Pesavento0d1d11c2022-04-11 22:11:34 -0400621} // namespace ndncert::tests