blob: 5dbdb3be81da875cf573852819dbf5489dbce9dd [file] [log] [blame]
Suyong Won57462ca2020-05-05 22:20:09 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
Davide Pesavento0dc02012021-11-23 22:55:03 -05003 * Copyright (c) 2017-2021, 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"
Zhiyi Zhang5d80e1e2020-09-25 11:34:54 -070025#include "test-common.hpp"
Suyong Won57462ca2020-05-05 22:20:09 -070026
Suyong Won57462ca2020-05-05 22:20:09 -070027namespace ndncert {
28namespace tests {
29
Davide Pesavento0dc02012021-11-23 22:55:03 -050030BOOST_FIXTURE_TEST_SUITE(Benchmark, IdentityManagementTimeFixture)
Suyong Won57462ca2020-05-05 22:20:09 -070031
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070032BOOST_AUTO_TEST_CASE(PacketSize0)
Suyong Won57462ca2020-05-05 22:20:09 -070033{
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070034 auto identity = addIdentity(Name("/ndn"));
35 auto key = identity.getDefaultKey();
36 auto cert = key.getDefaultCertificate();
37
Davide Pesavento0dc02012021-11-23 22:55:03 -050038 ndn::util::DummyClientFace face(io, m_keyChain, {true, true});
Zhiyi Zhang32d4b4e2020-10-28 22:10:49 -070039 ca::CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070040 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangcd57da82020-10-08 20:35:40 -070041 auto profileData = ca.getCaProfileData();
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070042
Davide Pesavento0dc02012021-11-23 22:55:03 -050043 Interest interest = ndn::MetadataObject::makeDiscoveryInterest(Name("/ndn/CA/INFO"));
Zhiyi Zhangaeab4972020-10-22 22:20:40 -070044 // std::cout << "CA Config discovery Interest Size: " << interest.wireEncode().size() << std::endl;
Davide Pesavento0dc02012021-11-23 22:55:03 -050045 std::shared_ptr<Interest> infoInterest;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070046
Zhiyi Zhang696cd042020-10-07 21:27:36 -070047 face.setInterestFilter(
Davide Pesavento0dc02012021-11-23 22:55:03 -050048 ndn::InterestFilter("/ndn/CA/INFO"),
Zhiyi Zhang696cd042020-10-07 21:27:36 -070049 [&](const auto&, const Interest& interest) {
Zhiyi Zhangaeab4972020-10-22 22:20:40 -070050 // std::cout << interest.getName() << std::endl;
Zhiyi Zhangcd57da82020-10-08 20:35:40 -070051 if (interest.getName() == profileData.getName()) {
52 face.put(profileData);
53 }
Zhiyi Zhang696cd042020-10-07 21:27:36 -070054 },
55 nullptr, nullptr);
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070056 advanceClocks(time::milliseconds(20), 60);
57
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070058 int count = 0;
59 face.onSendData.connect([&](const Data& response) {
60 if (count == 0) {
61 count++;
Zhiyi Zhangaeab4972020-10-22 22:20:40 -070062 // std::cout << "CA Config MetaData Size: " << response.wireEncode().size() << std::endl;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070063 auto block = response.getContent();
64 block.parse();
Zhiyi Zhang8f1ade32020-10-14 16:42:57 -070065 infoInterest =std::make_shared<Interest>(Name(block.get(ndn::tlv::Name)).appendSegment(0));
Zhiyi Zhangcd57da82020-10-08 20:35:40 -070066 infoInterest->setCanBePrefix(false);
Zhiyi Zhangaeab4972020-10-22 22:20:40 -070067 // std::cout << "CA Config fetch Interest Size: " << infoInterest->wireEncode().size() << std::endl;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070068 }
69 else {
70 count++;
Zhiyi Zhangaeab4972020-10-22 22:20:40 -070071 // std::cout << "CA Config Data Size: " << response.wireEncode().size() << std::endl;
Davide Pesavento0dc02012021-11-23 22:55:03 -050072 BOOST_CHECK(ndn::security::verifySignature(response, cert));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070073 auto contentBlock = response.getContent();
74 contentBlock.parse();
Zhiyi Zhangf22ae242020-11-17 10:51:15 -080075 auto caItem = infotlv::decodeDataContent(contentBlock);
Zhiyi Zhang44c6a352020-12-14 10:57:17 -080076 BOOST_CHECK_EQUAL(caItem.caPrefix, "/ndn");
77 BOOST_CHECK_EQUAL(caItem.probeParameterKeys.size(), 1);
78 BOOST_CHECK_EQUAL(caItem.probeParameterKeys.front(), "full name");
79 BOOST_CHECK_EQUAL(caItem.cert->wireEncode(), cert.wireEncode());
80 BOOST_CHECK_EQUAL(caItem.caInfo, "ndn testbed ca");
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070081 }
82 });
83 face.receive(interest);
84 advanceClocks(time::milliseconds(20), 60);
85 face.receive(*infoInterest);
86 advanceClocks(time::milliseconds(20), 60);
87
88 BOOST_CHECK_EQUAL(count, 2);
Suyong Won57462ca2020-05-05 22:20:09 -070089}
90
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070091BOOST_AUTO_TEST_CASE(PacketSize1)
92{
93 auto identity = addIdentity(Name("/ndn"));
94 auto key = identity.getDefaultKey();
95 auto cert = key.getDefaultCertificate();
Suyong Won57462ca2020-05-05 22:20:09 -070096
Davide Pesavento0dc02012021-11-23 22:55:03 -050097 ndn::util::DummyClientFace face(io, m_keyChain, {true, true});
Zhiyi Zhang32d4b4e2020-10-28 22:10:49 -070098 ca::CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070099 advanceClocks(time::milliseconds(20), 60);
100
101 // generate NEW Interest
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700102 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800103 item.caPrefix = Name("/ndn");
Davide Pesavento0dc02012021-11-23 22:55:03 -0500104 item.cert = std::make_shared<Certificate>(cert);
tylerliu4140fe82021-01-27 15:45:44 -0800105 requester::Request state(m_keyChain, item, RequestType::NEW);
106 auto newInterest = state.genNewInterest(Name("/ndn/alice"),
Davide Pesavento0dc02012021-11-23 22:55:03 -0500107 time::system_clock::now(),
108 time::system_clock::now() + time::days(1));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700109
Zhiyi Zhangaeab4972020-10-22 22:20:40 -0700110 // std::cout << "New Interest Size: " << newInterest->wireEncode().size() << std::endl;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700111
112 // generate CHALLENGE Interest
Davide Pesavento0dc02012021-11-23 22:55:03 -0500113 std::shared_ptr<Interest> challengeInterest;
114 std::shared_ptr<Interest> challengeInterest2;
115 std::shared_ptr<Interest> challengeInterest3;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700116
117 int count = 0;
118 face.onSendData.connect([&](const Data& response) {
119 if (Name("/ndn/CA/NEW").isPrefixOf(response.getName())) {
Zhiyi Zhangaeab4972020-10-22 22:20:40 -0700120 // std::cout << "NEW Data Size: " << response.wireEncode().size() << std::endl;
tylerliu4140fe82021-01-27 15:45:44 -0800121 auto challengeList = state.onNewRenewRevokeResponse(response);
122 auto paramList = state.selectOrContinueChallenge("pin");
123 challengeInterest = state.genChallengeInterest(std::move(paramList));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700124 }
125 else if (Name("/ndn/CA/CHALLENGE").isPrefixOf(response.getName()) && count == 0) {
126 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500127 BOOST_CHECK(ndn::security::verifySignature(response, cert));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700128
tylerliu4140fe82021-01-27 15:45:44 -0800129 state.onChallengeResponse(response);
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800130 BOOST_CHECK(state.m_status == Status::CHALLENGE);
131 BOOST_CHECK_EQUAL(state.m_challengeStatus, ChallengePin::NEED_CODE);
tylerliu4140fe82021-01-27 15:45:44 -0800132 auto paramList = state.selectOrContinueChallenge("pin");
133 challengeInterest2 = state.genChallengeInterest(std::move(paramList));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700134 }
135 else if (Name("/ndn/CA/CHALLENGE").isPrefixOf(response.getName()) && count == 1) {
136 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500137 BOOST_CHECK(ndn::security::verifySignature(response, cert));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700138
tylerliu4140fe82021-01-27 15:45:44 -0800139 state.onChallengeResponse(response);
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800140 BOOST_CHECK(state.m_status == Status::CHALLENGE);
141 BOOST_CHECK_EQUAL(state.m_challengeStatus, ChallengePin::WRONG_CODE);
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700142
tylerliu4140fe82021-01-27 15:45:44 -0800143 auto paramList = state.selectOrContinueChallenge("pin");
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700144 auto request = ca.getCertificateRequest(*challengeInterest2);
tylerliu7b9185c2020-11-24 12:15:18 -0800145 auto secret = request->challengeState->secrets.get(ChallengePin::PARAMETER_KEY_CODE, "");
tylerliu40226332020-11-11 15:37:16 -0800146 paramList.begin()->second = secret;
tylerliu4140fe82021-01-27 15:45:44 -0800147 challengeInterest3 = state.genChallengeInterest(std::move(paramList));
Zhiyi Zhangaeab4972020-10-22 22:20:40 -0700148 // std::cout << "CHALLENGE Interest Size: " << challengeInterest3->wireEncode().size() << std::endl;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700149 }
150 else if (Name("/ndn/CA/CHALLENGE").isPrefixOf(response.getName()) && count == 2) {
Zhiyi Zhangaeab4972020-10-22 22:20:40 -0700151 // std::cout << "CHALLENGE Data Size: " << response.wireEncode().size() << std::endl;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700152 count++;
Davide Pesavento0dc02012021-11-23 22:55:03 -0500153 BOOST_CHECK(ndn::security::verifySignature(response, cert));
tylerliu4140fe82021-01-27 15:45:44 -0800154 state.onChallengeResponse(response);
Zhiyi Zhang6499edd2021-02-17 22:37:21 -0800155 BOOST_CHECK(state.m_status == Status::SUCCESS);
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700156 }
157 });
158
159 face.receive(*newInterest);
160 advanceClocks(time::milliseconds(20), 60);
161 face.receive(*challengeInterest);
162 advanceClocks(time::milliseconds(20), 60);
163 face.receive(*challengeInterest2);
164 advanceClocks(time::milliseconds(20), 60);
165 face.receive(*challengeInterest3);
166 advanceClocks(time::milliseconds(20), 60);
167 BOOST_CHECK_EQUAL(count, 3);
168}
169
Davide Pesavento0dc02012021-11-23 22:55:03 -0500170BOOST_AUTO_TEST_SUITE_END() // Benchmark
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700171
Zhiyi Zhange4891b72020-10-10 15:11:57 -0700172} // namespace tests
173} // namespace ndncert