blob: 9f3047066f70860432ceca24611a7ac14e293b6e [file] [log] [blame]
Suyong Won57462ca2020-05-05 22:20:09 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
Davide Pesavento76304d82023-08-10 23:38:06 -04003 * Copyright (c) 2017-2023, Regents of the University of California.
Suyong Won57462ca2020-05-05 22:20:09 -07004 *
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
21#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>
30#include <ndn-cxx/security/verification-helpers.hpp>
31#include <ndn-cxx/util/dummy-client-face.hpp>
Suyong Won57462ca2020-05-05 22:20:09 -070032
Davide Pesavento0d1d11c2022-04-11 22:11:34 -040033namespace ndncert::tests {
Suyong Won57462ca2020-05-05 22:20:09 -070034
Davide Pesavento829aff62022-05-15 20:30:34 -040035BOOST_FIXTURE_TEST_SUITE(Benchmark, IoKeyChainFixture)
Suyong Won57462ca2020-05-05 22:20:09 -070036
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070037BOOST_AUTO_TEST_CASE(PacketSize0)
Suyong Won57462ca2020-05-05 22:20:09 -070038{
Davide Pesavento829aff62022-05-15 20:30:34 -040039 auto identity = m_keyChain.createIdentity(Name("/ndn"));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070040 auto key = identity.getDefaultKey();
41 auto cert = key.getDefaultCertificate();
42
Davide Pesavento76304d82023-08-10 23:38:06 -040043 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang32d4b4e2020-10-28 22:10:49 -070044 ca::CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070045 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangcd57da82020-10-08 20:35:40 -070046 auto profileData = ca.getCaProfileData();
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070047
Davide Pesavento0dc02012021-11-23 22:55:03 -050048 Interest interest = ndn::MetadataObject::makeDiscoveryInterest(Name("/ndn/CA/INFO"));
Zhiyi Zhangaeab4972020-10-22 22:20:40 -070049 // std::cout << "CA Config discovery Interest Size: " << interest.wireEncode().size() << std::endl;
Davide Pesavento0dc02012021-11-23 22:55:03 -050050 std::shared_ptr<Interest> infoInterest;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070051
Zhiyi Zhang696cd042020-10-07 21:27:36 -070052 face.setInterestFilter(
Davide Pesavento0dc02012021-11-23 22:55:03 -050053 ndn::InterestFilter("/ndn/CA/INFO"),
Zhiyi Zhang696cd042020-10-07 21:27:36 -070054 [&](const auto&, const Interest& interest) {
Zhiyi Zhangaeab4972020-10-22 22:20:40 -070055 // std::cout << interest.getName() << std::endl;
Zhiyi Zhangcd57da82020-10-08 20:35:40 -070056 if (interest.getName() == profileData.getName()) {
57 face.put(profileData);
58 }
Zhiyi Zhang696cd042020-10-07 21:27:36 -070059 },
60 nullptr, nullptr);
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070061 advanceClocks(time::milliseconds(20), 60);
62
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070063 int count = 0;
64 face.onSendData.connect([&](const Data& response) {
65 if (count == 0) {
66 count++;
Zhiyi Zhangaeab4972020-10-22 22:20:40 -070067 // std::cout << "CA Config MetaData Size: " << response.wireEncode().size() << std::endl;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070068 auto block = response.getContent();
69 block.parse();
Davide Pesavento64d5c8f2022-03-07 22:06:22 -050070 infoInterest = std::make_shared<Interest>(Name(block.get(ndn::tlv::Name)).appendSegment(0));
Zhiyi Zhangaeab4972020-10-22 22:20:40 -070071 // std::cout << "CA Config fetch Interest Size: " << infoInterest->wireEncode().size() << std::endl;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070072 }
73 else {
74 count++;
Zhiyi Zhangaeab4972020-10-22 22:20:40 -070075 // std::cout << "CA Config Data Size: " << response.wireEncode().size() << std::endl;
Davide Pesavento0dc02012021-11-23 22:55:03 -050076 BOOST_CHECK(ndn::security::verifySignature(response, cert));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070077 auto contentBlock = response.getContent();
78 contentBlock.parse();
Zhiyi Zhangf22ae242020-11-17 10:51:15 -080079 auto caItem = infotlv::decodeDataContent(contentBlock);
Zhiyi Zhang44c6a352020-12-14 10:57:17 -080080 BOOST_CHECK_EQUAL(caItem.caPrefix, "/ndn");
81 BOOST_CHECK_EQUAL(caItem.probeParameterKeys.size(), 1);
82 BOOST_CHECK_EQUAL(caItem.probeParameterKeys.front(), "full name");
83 BOOST_CHECK_EQUAL(caItem.cert->wireEncode(), cert.wireEncode());
84 BOOST_CHECK_EQUAL(caItem.caInfo, "ndn testbed ca");
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070085 }
86 });
87 face.receive(interest);
88 advanceClocks(time::milliseconds(20), 60);
89 face.receive(*infoInterest);
90 advanceClocks(time::milliseconds(20), 60);
91
92 BOOST_CHECK_EQUAL(count, 2);
Suyong Won57462ca2020-05-05 22:20:09 -070093}
94
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070095BOOST_AUTO_TEST_CASE(PacketSize1)
96{
Davide Pesavento829aff62022-05-15 20:30:34 -040097 auto identity = m_keyChain.createIdentity(Name("/ndn"));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070098 auto key = identity.getDefaultKey();
99 auto cert = key.getDefaultCertificate();
Suyong Won57462ca2020-05-05 22:20:09 -0700100
Davide Pesavento76304d82023-08-10 23:38:06 -0400101 ndn::DummyClientFace face(m_io, m_keyChain, {true, true});
Zhiyi Zhang32d4b4e2020-10-28 22:10:49 -0700102 ca::CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700103 advanceClocks(time::milliseconds(20), 60);
104
105 // generate NEW Interest
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700106 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800107 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500108 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800109 requester::Request state(m_keyChain, item, RequestType::NEW);
Davide Pesavento829aff62022-05-15 20:30:34 -0400110 auto newInterest = state.genNewInterest(m_keyChain.createIdentity(Name("/ndn/alice")).getDefaultKey().getName(),
Davide Pesavento0dc02012021-11-23 22:55:03 -0500111 time::system_clock::now(),
112 time::system_clock::now() + time::days(1));
Zhiyi Zhangaeab4972020-10-22 22:20:40 -0700113 // std::cout << "New Interest Size: " << newInterest->wireEncode().size() << std::endl;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700114
115 // generate CHALLENGE Interest
Davide Pesavento0dc02012021-11-23 22:55:03 -0500116 std::shared_ptr<Interest> challengeInterest;
117 std::shared_ptr<Interest> challengeInterest2;
118 std::shared_ptr<Interest> challengeInterest3;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700119
120 int count = 0;
121 face.onSendData.connect([&](const Data& response) {
122 if (Name("/ndn/CA/NEW").isPrefixOf(response.getName())) {
Zhiyi Zhangaeab4972020-10-22 22:20:40 -0700123 // std::cout << "NEW Data Size: " << response.wireEncode().size() << std::endl;
tylerliu4140fe82021-01-27 15:45:44 -0800124 auto challengeList = state.onNewRenewRevokeResponse(response);
125 auto paramList = state.selectOrContinueChallenge("pin");
126 challengeInterest = state.genChallengeInterest(std::move(paramList));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700127 }
128 else if (Name("/ndn/CA/CHALLENGE").isPrefixOf(response.getName()) && count == 0) {
129 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500130 BOOST_CHECK(ndn::security::verifySignature(response, cert));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700131
tylerliu4140fe82021-01-27 15:45:44 -0800132 state.onChallengeResponse(response);
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800133 BOOST_CHECK(state.m_status == Status::CHALLENGE);
134 BOOST_CHECK_EQUAL(state.m_challengeStatus, ChallengePin::NEED_CODE);
tylerliu4140fe82021-01-27 15:45:44 -0800135 auto paramList = state.selectOrContinueChallenge("pin");
136 challengeInterest2 = state.genChallengeInterest(std::move(paramList));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700137 }
138 else if (Name("/ndn/CA/CHALLENGE").isPrefixOf(response.getName()) && count == 1) {
139 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500140 BOOST_CHECK(ndn::security::verifySignature(response, cert));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700141
tylerliu4140fe82021-01-27 15:45:44 -0800142 state.onChallengeResponse(response);
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800143 BOOST_CHECK(state.m_status == Status::CHALLENGE);
144 BOOST_CHECK_EQUAL(state.m_challengeStatus, ChallengePin::WRONG_CODE);
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700145
tylerliu4140fe82021-01-27 15:45:44 -0800146 auto paramList = state.selectOrContinueChallenge("pin");
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700147 auto request = ca.getCertificateRequest(*challengeInterest2);
tylerliu7b9185c2020-11-24 12:15:18 -0800148 auto secret = request->challengeState->secrets.get(ChallengePin::PARAMETER_KEY_CODE, "");
tylerliu40226332020-11-11 15:37:16 -0800149 paramList.begin()->second = secret;
tylerliu4140fe82021-01-27 15:45:44 -0800150 challengeInterest3 = state.genChallengeInterest(std::move(paramList));
Zhiyi Zhangaeab4972020-10-22 22:20:40 -0700151 // std::cout << "CHALLENGE Interest Size: " << challengeInterest3->wireEncode().size() << std::endl;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700152 }
153 else if (Name("/ndn/CA/CHALLENGE").isPrefixOf(response.getName()) && count == 2) {
Zhiyi Zhangaeab4972020-10-22 22:20:40 -0700154 // std::cout << "CHALLENGE Data Size: " << response.wireEncode().size() << std::endl;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700155 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500156 BOOST_CHECK(ndn::security::verifySignature(response, cert));
tylerliu4140fe82021-01-27 15:45:44 -0800157 state.onChallengeResponse(response);
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800158 BOOST_CHECK(state.m_status == Status::SUCCESS);
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700159 }
160 });
161
162 face.receive(*newInterest);
163 advanceClocks(time::milliseconds(20), 60);
164 face.receive(*challengeInterest);
165 advanceClocks(time::milliseconds(20), 60);
166 face.receive(*challengeInterest2);
167 advanceClocks(time::milliseconds(20), 60);
168 face.receive(*challengeInterest3);
169 advanceClocks(time::milliseconds(20), 60);
170 BOOST_CHECK_EQUAL(count, 3);
171}
172
Davide Pesavento0dc02012021-11-23 22:55:03 -0500173BOOST_AUTO_TEST_SUITE_END() // Benchmark
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700174
Davide Pesavento0d1d11c2022-04-11 22:11:34 -0400175} // namespace ndncert::tests