blob: 0d848fddaece48d62697bda2bf9de5cb9e5e21b3 [file] [log] [blame]
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento0f830802018-01-16 23:58:58 -05002/*
Eric Newberrya3c8bd12020-05-15 17:27:07 -07003 * Copyright (c) 2013-2020 Regents of the University of California.
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6 *
7 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library 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 Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20 *
21 * @author Zhiyi Zhang <dreamerbarrychang@gmail.com>
22 */
23
Davide Pesavento7e780642018-11-24 15:51:34 -050024#include "ndn-cxx/security/v2/certificate.hpp"
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -070025
Davide Pesavento7e780642018-11-24 15:51:34 -050026#include "tests/boost-test.hpp"
27#include "tests/unit/unit-test-time-fixture.hpp"
Davide Pesavento74daf742018-11-23 18:14:13 -050028
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -070029#include <boost/lexical_cast.hpp>
30
31namespace ndn {
32namespace security {
33namespace v2 {
34namespace tests {
35
36using namespace ndn::tests;
37
38BOOST_AUTO_TEST_SUITE(Security)
39BOOST_AUTO_TEST_SUITE(V2)
40BOOST_FIXTURE_TEST_SUITE(TestCertificate, UnitTestTimeFixture)
41
42const uint8_t PUBLIC_KEY[] = {
43 0x30, 0x81, 0x9d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
44 0x01, 0x05, 0x00, 0x03, 0x81, 0x8b, 0x00, 0x30, 0x81, 0x87, 0x02, 0x81, 0x81, 0x00, 0x9e,
45 0x06, 0x3e, 0x47, 0x85, 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47, 0xac, 0x03, 0x24, 0x83, 0xb5,
46 0x9c, 0xa8, 0x05, 0x3a, 0x24, 0x1e, 0xeb, 0x89, 0x01, 0xbb, 0xe9, 0x9b, 0xb2, 0xc3, 0x22,
47 0xac, 0x68, 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7, 0x06, 0x90, 0x9c,
48 0xaa, 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3, 0x1b, 0x88,
49 0x9a, 0x97, 0x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82, 0xad,
50 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d, 0x24, 0xc2, 0x63, 0xf3, 0x97, 0x17, 0xeb, 0xfe,
51 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f, 0xb8, 0xf2, 0xf1,
52 0xc5, 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed, 0x35, 0xe7, 0x7a, 0x62,
53 0xea, 0x76, 0x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11
54};
55
56const uint8_t SIG_INFO[] = {
57 0x16, 0x55, 0x1B, 0x01, 0x01, 0x1C, 0x26, 0x07, 0x24, 0x08, 0x03, 0x6E, 0x64, 0x6E, 0x08, 0x05,
58 0x73, 0x69, 0x74, 0x65, 0x31, 0x08, 0x11, 0x6B, 0x73, 0x6B, 0x2D, 0x32, 0x35, 0x31, 0x36, 0x34,
59 0x32, 0x35, 0x33, 0x37, 0x37, 0x30, 0x39, 0x34, 0x08, 0x03, 0x4B, 0x45, 0x59, 0xFD, 0x00, 0xFD,
60 0x26, 0xFD, 0x00, 0xFE, 0x0F, 0x32, 0x30, 0x31, 0x35, 0x30, 0x38, 0x31, 0x34, 0x54, 0x32, 0x32,
61 0x33, 0x37, 0x33, 0x39, 0xFD, 0x00, 0xFF, 0x0F, 0x32, 0x30, 0x31, 0x35, 0x30, 0x38, 0x31, 0x38,
62 0x54, 0x32, 0x32, 0x33, 0x37, 0x33, 0x38
63};
64
65const uint8_t SIG_VALUE[] = {
Davide Pesavento14c56cd2020-05-21 01:44:03 -040066 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec, 0xe3, 0xb9, 0xea,
67 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6, 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41,
68 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38, 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6,
69 0x4d, 0x10, 0x1d, 0xdc, 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b,
70 0xcf, 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9, 0x64, 0xd6,
71 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8, 0x55, 0xf6, 0x1c, 0x19, 0x0b,
72 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7, 0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a,
73 0x6d, 0xdb, 0x56, 0xac, 0xa3, 0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1,
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -070074};
75
76const uint8_t CERT[] = {
77 0x06, 0xFD, 0x01, 0xBB, // Data
78 0x07, 0x33, // Name /ndn/site1/KEY/ksk-1416425377094/0123/%FD%00%00%01I%C9%8B
79 0x08, 0x03, 0x6E, 0x64, 0x6E,
80 0x08, 0x05, 0x73, 0x69, 0x74, 0x65, 0x31,
81 0x08, 0x03, 0x4B, 0x45, 0x59,
82 0x08, 0x11,
83 0x6B, 0x73, 0x6B, 0x2D, 0x31, 0x34, 0x31, 0x36, 0x34, 0x32, 0x35, 0x33, 0x37, 0x37, 0x30, 0x39,
84 0x34,
85 0x08, 0x04, 0x30, 0x31, 0x32, 0x33,
86 0x08, 0x07, 0xFD, 0x00, 0x00, 0x01, 0x49, 0xC9, 0x8B,
87 0x14, 0x09, // MetaInfo
88 0x18, 0x01, 0x02, // ContentType = Key
89 0x19, 0x04, 0x00, 0x36, 0xEE, 0x80, // FreshnessPeriod = 3600000 ms
90 0x15, 0xA0, // Content
91 0x30, 0x81, 0x9D, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01,
92 0x05, 0x00, 0x03, 0x81, 0x8B, 0x00, 0x30, 0x81, 0x87, 0x02, 0x81, 0x81, 0x00, 0x9E, 0x06, 0x3E,
93 0x47, 0x85, 0xB2, 0x34, 0x37, 0xAA, 0x85, 0x47, 0xAC, 0x03, 0x24, 0x83, 0xB5, 0x9C, 0xA8, 0x05,
94 0x3A, 0x24, 0x1E, 0xEB, 0x89, 0x01, 0xBB, 0xE9, 0x9B, 0xB2, 0xC3, 0x22, 0xAC, 0x68, 0xE3, 0xF0,
95 0x6C, 0x02, 0xCE, 0x68, 0xA6, 0xC4, 0xD0, 0xA7, 0x06, 0x90, 0x9C, 0xAA, 0x1B, 0x08, 0x1D, 0x8B,
96 0x43, 0x9A, 0x33, 0x67, 0x44, 0x6D, 0x21, 0xA3, 0x1B, 0x88, 0x9A, 0x97, 0x5E, 0x59, 0xC4, 0x15,
97 0x0B, 0xD9, 0x2C, 0xBD, 0x51, 0x07, 0x61, 0x82, 0xAD, 0xC1, 0xB8, 0xD7, 0xBF, 0x9B, 0xCF, 0x7D,
98 0x24, 0xC2, 0x63, 0xF3, 0x97, 0x17, 0xEB, 0xFE, 0x62, 0x25, 0xBA, 0x5B, 0x4D, 0x8A, 0xC2, 0x7A,
99 0xBD, 0x43, 0x8A, 0x8F, 0xB8, 0xF2, 0xF1, 0xC5, 0x6A, 0x30, 0xD3, 0x50, 0x8C, 0xC8, 0x9A, 0xDF,
100 0xEF, 0xED, 0x35, 0xE7, 0x7A, 0x62, 0xEA, 0x76, 0x7C, 0xBB, 0x08, 0x26, 0xC7, 0x02, 0x01, 0x11,
101 0x16, 0x55, // SignatureInfo
102 0x1B, 0x01, 0x01, // SignatureType
103 0x1C, 0x26, // KeyLocator: /ndn/site1/KEY/ksk-2516425377094
104 0x07, 0x24,
105 0x08, 0x03, 0x6E, 0x64, 0x6E,
106 0x08, 0x05, 0x73, 0x69, 0x74, 0x65, 0x31,
107 0x08, 0x03, 0x4B, 0x45, 0x59,
108 0x08, 0x11,
109 0x6B, 0x73, 0x6B, 0x2D, 0x32, 0x35, 0x31, 0x36, 0x34, 0x32, 0x35, 0x33, 0x37, 0x37, 0x30, 0x39,
110 0x34,
111 0xFD, 0x00, 0xFD, 0x26, // ValidityPeriod: (20150814T223739, 20150818T223738)
112 0xFD, 0x00, 0xFE, 0x0F,
113 0x32, 0x30, 0x31, 0x35, 0x30, 0x38, 0x31, 0x34, 0x54, 0x32, 0x32, 0x33, 0x37, 0x33, 0x39,
114 0xFD, 0x00, 0xFF, 0x0F,
115 0x32, 0x30, 0x31, 0x35, 0x30, 0x38, 0x31, 0x38, 0x54, 0x32, 0x32, 0x33, 0x37, 0x33, 0x38,
116 0x17, 0x80, // SignatureValue
117 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
118 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
119 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
120 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
121 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
122 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
123 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
124 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
125};
126
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700127static void
128generateFakeSignature(Data& data)
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -0700129{
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700130 SignatureInfo signatureInfo(Block(SIG_INFO, sizeof(SIG_INFO)));
131 signatureInfo.setKeyLocator(KeyLocator(Name("/ndn/site1/KEY/ksk-2516425377094")));
132 signatureInfo.setValidityPeriod(ValidityPeriod(time::fromIsoString("20141111T050000"),
133 time::fromIsoString("20141111T060000")));
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -0700134
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700135 data.setSignatureInfo(signatureInfo);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400136 data.setSignatureValue(make_shared<Buffer>(SIG_VALUE, sizeof(SIG_VALUE)));
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -0700137}
138
139BOOST_AUTO_TEST_CASE(Construction)
140{
141 Block block(CERT, sizeof(CERT));
142 Certificate certificate(block);
143
144 BOOST_CHECK_EQUAL(certificate.getName(), "/ndn/site1/KEY/ksk-1416425377094/0123/%FD%00%00%01I%C9%8B");
145 BOOST_CHECK_EQUAL(certificate.getKeyName(), "/ndn/site1/KEY/ksk-1416425377094");
146 BOOST_CHECK_EQUAL(certificate.getIdentity(), "/ndn/site1");
147 BOOST_CHECK_EQUAL(certificate.getIssuerId(), name::Component("0123"));
148 BOOST_CHECK_EQUAL(certificate.getKeyId(), name::Component("ksk-1416425377094"));
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400149 BOOST_REQUIRE_EQUAL(certificate.getKeyLocator().has_value(), true);
150 BOOST_CHECK_EQUAL(certificate.getKeyLocator()->getName(), "/ndn/site1/KEY/ksk-2516425377094");
151 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(certificate.getValidityPeriod()),
152 "(20150814T223739, 20150818T223738)");
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -0700153
154 BOOST_CHECK_THROW(certificate.getExtension(12345), ndn::SignatureInfo::Error);
155 BOOST_CHECK_NO_THROW(certificate.getPublicKey());
156
157 Data data(block);
158 Certificate certificate2(std::move(data));
159 BOOST_CHECK_EQUAL(certificate, certificate2);
160}
161
162BOOST_AUTO_TEST_CASE(Setters)
163{
164 Certificate certificate;
165 certificate.setName("/ndn/site1/KEY/ksk-1416425377094/0123/%FD%00%00%01I%C9%8B");
Davide Pesavento0f830802018-01-16 23:58:58 -0500166 certificate.setFreshnessPeriod(1_h);
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -0700167 certificate.setContent(PUBLIC_KEY, sizeof(PUBLIC_KEY));
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700168 generateFakeSignature(certificate);
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -0700169
170 BOOST_CHECK_EQUAL(certificate.getName(), "/ndn/site1/KEY/ksk-1416425377094/0123/%FD%00%00%01I%C9%8B");
171 BOOST_CHECK_EQUAL(certificate.getKeyName(), "/ndn/site1/KEY/ksk-1416425377094");
172 BOOST_CHECK_EQUAL(certificate.getIdentity(), "/ndn/site1");
173 BOOST_CHECK_EQUAL(certificate.getIssuerId(), name::Component("0123"));
174 BOOST_CHECK_EQUAL(certificate.getKeyId(), name::Component("ksk-1416425377094"));
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400175 BOOST_REQUIRE_EQUAL(certificate.getKeyLocator().has_value(), true);
176 BOOST_CHECK_EQUAL(certificate.getKeyLocator()->getName(), "/ndn/site1/KEY/ksk-2516425377094");
177 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(certificate.getValidityPeriod()),
178 "(20141111T050000, 20141111T060000)");
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -0700179
180 BOOST_CHECK_THROW(certificate.getExtension(12345), ndn::SignatureInfo::Error);
181 BOOST_CHECK_NO_THROW(certificate.getPublicKey());
182}
183
184BOOST_AUTO_TEST_CASE(ValidityPeriodChecking)
185{
186 Certificate certificate;
187 certificate.setName("/ndn/site1/KEY/ksk-1416425377094/0123/%FD%00%00%01I%C9%8B");
Davide Pesavento0f830802018-01-16 23:58:58 -0500188 certificate.setFreshnessPeriod(1_h);
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -0700189 certificate.setContent(PUBLIC_KEY, sizeof(PUBLIC_KEY));
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700190 generateFakeSignature(certificate);
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -0700191
192 BOOST_CHECK_EQUAL(certificate.isValid(), true);
193 BOOST_CHECK_EQUAL(certificate.isValid(time::fromIsoString("20141111T045959")), false);
194 BOOST_CHECK_EQUAL(certificate.isValid(time::fromIsoString("20141111T060001")), false);
195}
196
197// This fixture prepares a well-formed certificate. A test case then modifies one of the
198// fields, and verifies the Certificate class correctly identifies the certificate as
199// malformed.
200class InvalidCertFixture
201{
202public:
203 InvalidCertFixture()
204 {
205 Certificate certBase(Block(CERT, sizeof(CERT)));
206 BOOST_CHECK_NO_THROW((Certificate(certBase)));
207
208 m_certBase = Data(certBase);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700209 generateFakeSignature(m_certBase);
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -0700210
211 BOOST_CHECK_NO_THROW((Certificate(m_certBase)));
212 }
213
214public:
215 Data m_certBase;
216};
217
218BOOST_FIXTURE_TEST_CASE(InvalidName, InvalidCertFixture)
219{
220 Data data(m_certBase);
221 data.setName("/ndn/site1/ksk-1416425377094/0123/%FD%00%00%01I%C9%8B");
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700222 generateFakeSignature(data);
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -0700223
224 BOOST_CHECK_THROW((Certificate(data)), Certificate::Error);
225 BOOST_CHECK_THROW((Certificate(std::move(data))), Certificate::Error);
226}
227
228BOOST_FIXTURE_TEST_CASE(InvalidType, InvalidCertFixture)
229{
230 Data data(m_certBase);
231 data.setContentType(tlv::ContentType_Blob);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700232 generateFakeSignature(data);
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -0700233
234 BOOST_CHECK_THROW((Certificate(data)), Certificate::Error);
235 BOOST_CHECK_THROW((Certificate(std::move(data))), Certificate::Error);
236}
237
238BOOST_FIXTURE_TEST_CASE(EmptyContent, InvalidCertFixture)
239{
240 Data data(m_certBase);
241 data.setContent(nullptr, 0);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700242 generateFakeSignature(data);
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -0700243
244 BOOST_CHECK_THROW((Certificate(data)), Certificate::Error);
245 BOOST_CHECK_THROW((Certificate(std::move(data))), Certificate::Error);
246
247 Certificate cert(m_certBase);
248 cert.setContent(nullptr, 0);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700249 generateFakeSignature(cert);
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -0700250 BOOST_CHECK_THROW(cert.getPublicKey(), Certificate::Error);
251}
252
Alexander Afanasyev5f1820e2017-01-04 18:12:42 -0800253BOOST_AUTO_TEST_CASE(PrintCertificateInfo)
254{
255 const std::string expectedCertificateInfo = std::string(R"INFO(
256Certificate name:
257 /ndn/site1/KEY/ksk-1416425377094/0123/%FD%00%00%01I%C9%8B
258Validity:
259 NotBefore: 20150814T223739
260 NotAfter: 20150818T223738
261Public key bits:
262 MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCeBj5HhbI0N6qFR6wDJIO1nKgF
263 OiQe64kBu+mbssMirGjj8GwCzmimxNCnBpCcqhsIHYtDmjNnRG0hoxuImpdeWcQV
264 C9ksvVEHYYKtwbjXv5vPfSTCY/OXF+v+YiW6W02Kwnq9Q4qPuPLxxWow01CMyJrf
265 7+0153pi6nZ8uwgmxwIBEQ==
266Signature Information:
267 Signature Type: SignatureSha256WithRsa
268 Key Locator: Name=/ndn/site1/KEY/ksk-2516425377094
269)INFO").substr(1);
270
271 Certificate certificate(Block(CERT, sizeof(CERT)));
272 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(certificate), expectedCertificateInfo);
273
274 // @todo Check output formats of other certificates
275}
276
Zhiyi Zhangf4bb5c72015-08-19 19:02:51 -0700277BOOST_AUTO_TEST_SUITE_END() // TestCertificate
278BOOST_AUTO_TEST_SUITE_END() // V2
279BOOST_AUTO_TEST_SUITE_END() // Security
280
281} // namespace tests
282} // namespace v2
283} // namespace security
284} // namespace ndn