blob: 4877237e8e4ba658ac2c4cfa29d496bfb546d165 [file] [log] [blame]
Suyong Won57462ca2020-05-05 22:20:09 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
Zhiyi Zhang74c61142020-10-07 21:00:49 -07003 * Copyright (c) 2017-2020, 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"
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070024#include "requester.hpp"
Zhiyi Zhang5d80e1e2020-09-25 11:34:54 -070025#include "test-common.hpp"
Suyong Won57462ca2020-05-05 22:20:09 -070026
27namespace ndn {
28namespace ndncert {
29namespace tests {
30
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070031BOOST_FIXTURE_TEST_SUITE(TestForBenchmark, IdentityManagementTimeFixture)
Suyong Won57462ca2020-05-05 22:20:09 -070032
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070033BOOST_AUTO_TEST_CASE(PacketSize0)
Suyong Won57462ca2020-05-05 22:20:09 -070034{
Zhiyi Zhang615b6b72021-01-11 14:25:32 -080035 name::setConventionEncoding(name::Convention::TYPED);
36
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070037 auto identity = addIdentity(Name("/ndn"));
38 auto key = identity.getDefaultKey();
39 auto cert = key.getDefaultCertificate();
40
Zhiyi Zhang22998612020-09-25 14:43:23 -070041 util::DummyClientFace face(io, m_keyChain, {true, true});
Zhiyi Zhang32d4b4e2020-10-28 22:10:49 -070042 ca::CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070043 advanceClocks(time::milliseconds(20), 60);
Zhiyi Zhangcd57da82020-10-08 20:35:40 -070044 auto profileData = ca.getCaProfileData();
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070045
46 Interest interest = MetadataObject::makeDiscoveryInterest(Name("/ndn/CA/INFO"));
Zhiyi Zhangaeab4972020-10-22 22:20:40 -070047 // std::cout << "CA Config discovery Interest Size: " << interest.wireEncode().size() << std::endl;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070048 shared_ptr<Interest> infoInterest = nullptr;
49
Zhiyi Zhang696cd042020-10-07 21:27:36 -070050 face.setInterestFilter(
51 InterestFilter("/ndn/CA/INFO"),
52 [&](const auto&, const Interest& interest) {
Zhiyi Zhangaeab4972020-10-22 22:20:40 -070053 // std::cout << interest.getName() << std::endl;
Zhiyi Zhangcd57da82020-10-08 20:35:40 -070054 if (interest.getName() == profileData.getName()) {
55 face.put(profileData);
56 }
Zhiyi Zhang696cd042020-10-07 21:27:36 -070057 },
58 nullptr, nullptr);
Zhiyi Zhangfbcab842020-10-07 15:17:13 -070059 advanceClocks(time::milliseconds(20), 60);
60
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070061 int count = 0;
62 face.onSendData.connect([&](const Data& response) {
63 if (count == 0) {
64 count++;
Zhiyi Zhangaeab4972020-10-22 22:20:40 -070065 // std::cout << "CA Config MetaData Size: " << response.wireEncode().size() << std::endl;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070066 auto block = response.getContent();
67 block.parse();
Zhiyi Zhang8f1ade32020-10-14 16:42:57 -070068 infoInterest =std::make_shared<Interest>(Name(block.get(ndn::tlv::Name)).appendSegment(0));
Zhiyi Zhangcd57da82020-10-08 20:35:40 -070069 infoInterest->setCanBePrefix(false);
Zhiyi Zhangaeab4972020-10-22 22:20:40 -070070 // std::cout << "CA Config fetch Interest Size: " << infoInterest->wireEncode().size() << std::endl;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070071 }
72 else {
73 count++;
Zhiyi Zhangaeab4972020-10-22 22:20:40 -070074 // std::cout << "CA Config Data Size: " << response.wireEncode().size() << std::endl;
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070075 BOOST_CHECK(security::verifySignature(response, cert));
76 auto contentBlock = response.getContent();
77 contentBlock.parse();
Zhiyi Zhangf22ae242020-11-17 10:51:15 -080078 auto caItem = infotlv::decodeDataContent(contentBlock);
Zhiyi Zhang44c6a352020-12-14 10:57:17 -080079 BOOST_CHECK_EQUAL(caItem.caPrefix, "/ndn");
80 BOOST_CHECK_EQUAL(caItem.probeParameterKeys.size(), 1);
81 BOOST_CHECK_EQUAL(caItem.probeParameterKeys.front(), "full name");
82 BOOST_CHECK_EQUAL(caItem.cert->wireEncode(), cert.wireEncode());
83 BOOST_CHECK_EQUAL(caItem.caInfo, "ndn testbed ca");
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070084 }
85 });
86 face.receive(interest);
87 advanceClocks(time::milliseconds(20), 60);
88 face.receive(*infoInterest);
89 advanceClocks(time::milliseconds(20), 60);
90
91 BOOST_CHECK_EQUAL(count, 2);
Suyong Won57462ca2020-05-05 22:20:09 -070092}
93
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -070094BOOST_AUTO_TEST_CASE(PacketSize1)
95{
96 auto identity = addIdentity(Name("/ndn"));
97 auto key = identity.getDefaultKey();
98 auto cert = key.getDefaultCertificate();
Suyong Won57462ca2020-05-05 22:20:09 -070099
Zhiyi Zhang22998612020-09-25 14:43:23 -0700100 util::DummyClientFace face(io, m_keyChain, {true, true});
Zhiyi Zhang32d4b4e2020-10-28 22:10:49 -0700101 ca::CaModule ca(face, m_keyChain, "tests/unit-tests/config-files/config-ca-1", "ca-storage-memory");
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700102 advanceClocks(time::milliseconds(20), 60);
103
104 // generate NEW Interest
Zhiyi Zhang1d3dcd22020-10-01 22:25:43 -0700105 CaProfile item;
Zhiyi Zhang44c6a352020-12-14 10:57:17 -0800106 item.caPrefix = Name("/ndn");
107 item.cert = std::make_shared<security::Certificate>(cert);
tylerliubb630362020-11-10 11:31:35 -0800108 requester::RequestState state(m_keyChain, item, RequestType::NEW);
Zhiyi Zhang3002e6b2020-10-29 18:54:07 -0700109 auto newInterest = requester::Requester::genNewInterest(state, Name("/ndn/alice"),
Zhiyi Zhang4f1c0102020-12-21 15:08:09 -0800110 time::system_clock::now(),
111 time::system_clock::now() + time::days(1));
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700112
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
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700116 shared_ptr<Interest> challengeInterest = nullptr;
117 shared_ptr<Interest> challengeInterest2 = nullptr;
118 shared_ptr<Interest> challengeInterest3 = nullptr;
119
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;
Zhiyi Zhang3002e6b2020-10-29 18:54:07 -0700124 auto challengeList = requester::Requester::onNewRenewRevokeResponse(state, response);
125 auto paramList = requester::Requester::selectOrContinueChallenge(state, "pin");
126 challengeInterest = requester::Requester::genChallengeInterest(state, 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++;
130 BOOST_CHECK(security::verifySignature(response, cert));
131
Zhiyi Zhang3002e6b2020-10-29 18:54:07 -0700132 requester::Requester::onChallengeResponse(state, response);
tylerliuf2e6bb52020-12-13 13:23:05 -0800133 BOOST_CHECK(state.status == Status::CHALLENGE);
134 BOOST_CHECK_EQUAL(state.challengeStatus, ChallengePin::NEED_CODE);
Zhiyi Zhang3002e6b2020-10-29 18:54:07 -0700135 auto paramList = requester::Requester::selectOrContinueChallenge(state, "pin");
136 challengeInterest2 = requester::Requester::genChallengeInterest(state, 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++;
140 BOOST_CHECK(security::verifySignature(response, cert));
141
Zhiyi Zhang3002e6b2020-10-29 18:54:07 -0700142 requester::Requester::onChallengeResponse(state, response);
tylerliuf2e6bb52020-12-13 13:23:05 -0800143 BOOST_CHECK(state.status == Status::CHALLENGE);
144 BOOST_CHECK_EQUAL(state.challengeStatus, ChallengePin::WRONG_CODE);
Zhiyi Zhangfc1678a2020-05-12 16:52:14 -0700145
Zhiyi Zhang3002e6b2020-10-29 18:54:07 -0700146 auto paramList = requester::Requester::selectOrContinueChallenge(state, "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;
Zhiyi Zhang3002e6b2020-10-29 18:54:07 -0700150 challengeInterest3 = requester::Requester::genChallengeInterest(state, 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++;
156 BOOST_CHECK(security::verifySignature(response, cert));
Zhiyi Zhang3002e6b2020-10-29 18:54:07 -0700157 requester::Requester::onChallengeResponse(state, response);
tylerliuf2e6bb52020-12-13 13:23:05 -0800158 BOOST_CHECK(state.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
173BOOST_AUTO_TEST_SUITE_END() // TestCaConfig
174
Zhiyi Zhange4891b72020-10-10 15:11:57 -0700175} // namespace tests
176} // namespace ndncert
177} // namespace ndn