blob: 063e3fced2b6465b35ffad153b7d7c79eed4b905 [file] [log] [blame]
Yingdi Yub263f152015-07-12 16:50:13 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento6158f472017-08-11 18:55:09 -04002/*
Davide Pesavento809f7542021-03-24 18:53:05 -04003 * Copyright (c) 2013-2021 Regents of the University of California.
Yingdi Yub263f152015-07-12 16:50:13 -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
Davide Pesavento7e780642018-11-24 15:51:34 -050022#include "ndn-cxx/security/transform/signer-filter.hpp"
Yingdi Yub263f152015-07-12 16:50:13 -070023
Davide Pesavento7e780642018-11-24 15:51:34 -050024#include "ndn-cxx/encoding/buffer-stream.hpp"
Laqin Fan0fe72ea2019-05-22 16:42:59 -050025#include "ndn-cxx/security/key-params.hpp"
Davide Pesavento7e780642018-11-24 15:51:34 -050026#include "ndn-cxx/security/transform/base64-decode.hpp"
27#include "ndn-cxx/security/transform/buffer-source.hpp"
28#include "ndn-cxx/security/transform/private-key.hpp"
29#include "ndn-cxx/security/transform/stream-sink.hpp"
30#include "ndn-cxx/security/verification-helpers.hpp"
Yingdi Yub263f152015-07-12 16:50:13 -070031
Davide Pesavento7e780642018-11-24 15:51:34 -050032#include "tests/boost-test.hpp"
Yingdi Yub263f152015-07-12 16:50:13 -070033
34namespace ndn {
35namespace security {
36namespace transform {
37namespace tests {
38
39BOOST_AUTO_TEST_SUITE(Security)
40BOOST_AUTO_TEST_SUITE(Transform)
41BOOST_AUTO_TEST_SUITE(TestSignerFilter)
42
43BOOST_AUTO_TEST_CASE(Rsa)
44{
Davide Pesavento6158f472017-08-11 18:55:09 -040045 const std::string publicKeyPkcs8 =
Yingdi Yub263f152015-07-12 16:50:13 -070046 "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw0WM1/WhAxyLtEqsiAJg\n"
47 "WDZWuzkYpeYVdeeZcqRZzzfRgBQTsNozS5t4HnwTZhwwXbH7k3QN0kRTV826Xobw\n"
48 "s3iigohnM9yTK+KKiayPhIAm/+5HGT6SgFJhYhqo1/upWdueojil6RP4/AgavHho\n"
49 "pxlAVbk6G9VdVnlQcQ5Zv0OcGi73c+EnYD/YgURYGSngUi/Ynsh779p2U69/te9g\n"
50 "ZwIL5PuE9BiO6I39cL9z7EK1SfZhOWvDe/qH7YhD/BHwcWit8FjRww1glwRVTJsA\n"
51 "9rH58ynaAix0tcR/nBMRLUX+e3rURHg6UbSjJbdb9qmKM1fTGHKUzL/5pMG6uBU0\n"
52 "ywIDAQAB\n";
Davide Pesavento6158f472017-08-11 18:55:09 -040053 const std::string privateKeyPkcs1 =
Yingdi Yub263f152015-07-12 16:50:13 -070054 "MIIEpAIBAAKCAQEAw0WM1/WhAxyLtEqsiAJgWDZWuzkYpeYVdeeZcqRZzzfRgBQT\n"
55 "sNozS5t4HnwTZhwwXbH7k3QN0kRTV826Xobws3iigohnM9yTK+KKiayPhIAm/+5H\n"
56 "GT6SgFJhYhqo1/upWdueojil6RP4/AgavHhopxlAVbk6G9VdVnlQcQ5Zv0OcGi73\n"
57 "c+EnYD/YgURYGSngUi/Ynsh779p2U69/te9gZwIL5PuE9BiO6I39cL9z7EK1SfZh\n"
58 "OWvDe/qH7YhD/BHwcWit8FjRww1glwRVTJsA9rH58ynaAix0tcR/nBMRLUX+e3rU\n"
59 "RHg6UbSjJbdb9qmKM1fTGHKUzL/5pMG6uBU0ywIDAQABAoIBADQkckOIl4IZMUTn\n"
60 "W8LFv6xOdkJwMKC8G6bsPRFbyY+HvC2TLt7epSvfS+f4AcYWaOPcDu2E49vt2sNr\n"
61 "cASly8hgwiRRAB3dHH9vcsboiTo8bi2RFvMqvjv9w3tK2yMxVDtmZamzrrnaV3YV\n"
62 "Q+5nyKo2F/PMDjQ4eUAKDOzjhBuKHsZBTFnA1MFNI+UKj5X4Yp64DFmKlxTX/U2b\n"
63 "wzVywo5hzx2Uhw51jmoLls4YUvMJXD0wW5ZtYRuPogXvXb/of9ef/20/wU11WFKg\n"
64 "Xb4gfR8zUXaXS1sXcnVm3+24vIs9dApUwykuoyjOqxWqcHRec2QT2FxVGkFEraze\n"
65 "CPa4rMECgYEA5Y8CywomIcTgerFGFCeMHJr8nQGqY2V/owFb3k9maczPnC9p4a9R\n"
66 "c5szLxA9FMYFxurQZMBWSEG2JS1HR2mnjigx8UKjYML/A+rvvjZOMe4M6Sy2ggh4\n"
67 "SkLZKpWTzjTe07ByM/j5v/SjNZhWAG7sw4/LmPGRQkwJv+KZhGojuOkCgYEA2cOF\n"
68 "T6cJRv6kvzTz9S0COZOVm+euJh/BXp7oAsAmbNfOpckPMzqHXy8/wpdKl6AAcB57\n"
69 "OuztlNfV1D7qvbz7JuRlYwQ0cEfBgbZPcz1p18HHDXhwn57ZPb8G33Yh9Omg0HNA\n"
70 "Imb4LsVuSqxA6NwSj7cpRekgTedrhLFPJ+Ydb5MCgYEAsM3Q7OjILcIg0t6uht9e\n"
71 "vrlwTsz1mtCV2co2I6crzdj9HeI2vqf1KAElDt6G7PUHhglcr/yjd8uEqmWRPKNX\n"
72 "ddnnfVZB10jYeP/93pac6z/Zmc3iU4yKeUe7U10ZFf0KkiiYDQd59CpLef/2XScS\n"
73 "HB0oRofnxRQjfjLc4muNT+ECgYEAlcDk06MOOTly+F8lCc1bA1dgAmgwFd2usDBd\n"
74 "Y07a3e0HGnGLN3Kfl7C5i0tZq64HvxLnMd2vgLVxQlXGPpdQrC1TH+XLXg+qnlZO\n"
75 "ivSH7i0/gx75bHvj75eH1XK65V8pDVDEoSPottllAIs21CxLw3N1ObOZWJm2EfmR\n"
76 "cuHICmsCgYAtFJ1idqMoHxES3mlRpf2JxyQudP3SCm2WpGmqVzhRYInqeatY5sUd\n"
77 "lPLHm/p77RT7EyxQHTlwn8FJPuM/4ZH1rQd/vB+Y8qAtYJCexDMsbvLW+Js+VOvk\n"
78 "jweEC0nrcL31j9mF0vz5E6tfRu4hhJ6L4yfWs0gSejskeVB/w8QY4g==\n";
Davide Pesavento765abc92021-12-27 00:44:04 -050079 const uint8_t data[] = {0x01, 0x02, 0x03, 0x04};
Yingdi Yub263f152015-07-12 16:50:13 -070080
81 OBufferStream os1;
82 bufferSource(publicKeyPkcs8) >> base64Decode() >> streamSink(os1);
Davide Pesavento6158f472017-08-11 18:55:09 -040083 auto pubKey = os1.buf();
Yingdi Yub263f152015-07-12 16:50:13 -070084
85 PrivateKey sKey;
Davide Pesavento765abc92021-12-27 00:44:04 -050086 sKey.loadPkcs1Base64({reinterpret_cast<const uint8_t*>(privateKeyPkcs1.data()),
87 privateKeyPkcs1.size()});
Yingdi Yub263f152015-07-12 16:50:13 -070088
Davide Pesavento06f1bdf2017-09-16 18:59:15 -040089 BOOST_CHECK_THROW(SignerFilter(DigestAlgorithm::NONE, sKey), Error);
90
Davide Pesavento6158f472017-08-11 18:55:09 -040091 OBufferStream os2;
Davide Pesavento765abc92021-12-27 00:44:04 -050092 bufferSource(data) >> signerFilter(DigestAlgorithm::SHA256, sKey) >> streamSink(os2);
Davide Pesavento6158f472017-08-11 18:55:09 -040093 auto sig = os2.buf();
Yingdi Yub263f152015-07-12 16:50:13 -070094
Davide Pesavento765abc92021-12-27 00:44:04 -050095 BOOST_TEST(verifySignature({{data, sizeof(data)}}, sig->data(), sig->size(), pubKey->data(), pubKey->size()));
Yingdi Yub263f152015-07-12 16:50:13 -070096}
97
98BOOST_AUTO_TEST_CASE(Ecdsa)
99{
Davide Pesavento6158f472017-08-11 18:55:09 -0400100 const std::string privateKeyPkcs1 =
Yingdi Yub263f152015-07-12 16:50:13 -0700101 "MIIBaAIBAQQgRxwcbzK9RV6AHYFsDcykI86o3M/a1KlJn0z8PcLMBZOggfowgfcC\n"
102 "AQEwLAYHKoZIzj0BAQIhAP////8AAAABAAAAAAAAAAAAAAAA////////////////\n"
103 "MFsEIP////8AAAABAAAAAAAAAAAAAAAA///////////////8BCBaxjXYqjqT57Pr\n"
104 "vVV2mIa8ZR0GsMxTsPY7zjw+J9JgSwMVAMSdNgiG5wSTamZ44ROdJreBn36QBEEE\n"
105 "axfR8uEsQkf4vOblY6RA8ncDfYEt6zOg9KE5RdiYwpZP40Li/hp/m47n60p8D54W\n"
106 "K84zV2sxXs7LtkBoN79R9QIhAP////8AAAAA//////////+85vqtpxeehPO5ysL8\n"
107 "YyVRAgEBoUQDQgAEaG4WJuDAt0QkEM4t29KDUdzkQlMPGrqWzkWhgt9OGnwc6O7A\n"
108 "ZLPSrDyhwyrKS7XLRXml5DisQ93RvByll32y8A==\n";
Davide Pesavento6158f472017-08-11 18:55:09 -0400109 const std::string publicKeyPkcs8 =
Yingdi Yub263f152015-07-12 16:50:13 -0700110 "MIIBSzCCAQMGByqGSM49AgEwgfcCAQEwLAYHKoZIzj0BAQIhAP////8AAAABAAAA\n"
111 "AAAAAAAAAAAA////////////////MFsEIP////8AAAABAAAAAAAAAAAAAAAA////\n"
112 "///////////8BCBaxjXYqjqT57PrvVV2mIa8ZR0GsMxTsPY7zjw+J9JgSwMVAMSd\n"
113 "NgiG5wSTamZ44ROdJreBn36QBEEEaxfR8uEsQkf4vOblY6RA8ncDfYEt6zOg9KE5\n"
114 "RdiYwpZP40Li/hp/m47n60p8D54WK84zV2sxXs7LtkBoN79R9QIhAP////8AAAAA\n"
115 "//////////+85vqtpxeehPO5ysL8YyVRAgEBA0IABGhuFibgwLdEJBDOLdvSg1Hc\n"
116 "5EJTDxq6ls5FoYLfThp8HOjuwGSz0qw8ocMqyku1y0V5peQ4rEPd0bwcpZd9svA=\n";
Davide Pesavento765abc92021-12-27 00:44:04 -0500117 const uint8_t data[] = {0x01, 0x02, 0x03, 0x04};
Yingdi Yub263f152015-07-12 16:50:13 -0700118
119 OBufferStream os1;
120 bufferSource(publicKeyPkcs8) >> base64Decode() >> streamSink(os1);
Davide Pesavento6158f472017-08-11 18:55:09 -0400121 auto pubKey = os1.buf();
Yingdi Yub263f152015-07-12 16:50:13 -0700122
123 PrivateKey sKey;
Davide Pesavento765abc92021-12-27 00:44:04 -0500124 sKey.loadPkcs1Base64({reinterpret_cast<const uint8_t*>(privateKeyPkcs1.data()),
125 privateKeyPkcs1.size()});
Yingdi Yub263f152015-07-12 16:50:13 -0700126
Davide Pesavento06f1bdf2017-09-16 18:59:15 -0400127 BOOST_CHECK_THROW(SignerFilter(DigestAlgorithm::NONE, sKey), Error);
128
Davide Pesavento6158f472017-08-11 18:55:09 -0400129 OBufferStream os2;
Davide Pesavento765abc92021-12-27 00:44:04 -0500130 bufferSource(data) >> signerFilter(DigestAlgorithm::SHA256, sKey) >> streamSink(os2);
Davide Pesavento6158f472017-08-11 18:55:09 -0400131 auto sig = os2.buf();
Yingdi Yub263f152015-07-12 16:50:13 -0700132
Davide Pesavento765abc92021-12-27 00:44:04 -0500133 BOOST_TEST(verifySignature({{data, sizeof(data)}}, sig->data(), sig->size(), pubKey->data(), pubKey->size()));
Laqin Fan0fe72ea2019-05-22 16:42:59 -0500134}
135
Davide Pesavento5e494c02019-09-29 16:30:19 -0400136BOOST_AUTO_TEST_SUITE(Hmac)
137
138// Test vectors from RFC 4231
Davide Pesavento93101df2021-06-15 18:33:09 -0400139// https://datatracker.ietf.org/doc/html/rfc4231#section-4
Davide Pesavento5e494c02019-09-29 16:30:19 -0400140BOOST_AUTO_TEST_CASE(Rfc4231Test1)
Laqin Fan0fe72ea2019-05-22 16:42:59 -0500141{
Davide Pesavento5e494c02019-09-29 16:30:19 -0400142 // Test case 1
143 const uint8_t rawKey[] = {0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
144 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
145 const std::string data("Hi There");
146 const uint8_t hmacSha224[] = {0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32,
147 0x10, 0x7c, 0xd4, 0x9d, 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16,
148 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22};
149 const uint8_t hmacSha256[] = {0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8,
150 0xaf, 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00,
151 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32,
152 0xcf, 0xf7};
153 const uint8_t hmacSha384[] = {0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08,
154 0x25, 0xf4, 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb,
155 0xe4, 0x10, 0x1e, 0xc6, 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb,
156 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9, 0x07, 0x6e, 0xde, 0x7f,
157 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6};
158 const uint8_t hmacSha512[] = {0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0,
159 0xb4, 0x24, 0x1a, 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2,
160 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0, 0xb3, 0x05, 0x45, 0xe1,
161 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7, 0x02,
162 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d,
163 0x91, 0x4e, 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20,
164 0x3a, 0x12, 0x68, 0x54};
Laqin Fan0fe72ea2019-05-22 16:42:59 -0500165
Davide Pesavento5e494c02019-09-29 16:30:19 -0400166 PrivateKey key;
Davide Pesavento765abc92021-12-27 00:44:04 -0500167 key.loadRaw(KeyType::HMAC, rawKey);
Laqin Fan0fe72ea2019-05-22 16:42:59 -0500168
Davide Pesavento5e494c02019-09-29 16:30:19 -0400169 BOOST_CHECK_THROW(SignerFilter(DigestAlgorithm::NONE, key), Error);
Laqin Fan0fe72ea2019-05-22 16:42:59 -0500170
Davide Pesavento5e494c02019-09-29 16:30:19 -0400171 OBufferStream os224;
172 bufferSource(data) >> signerFilter(DigestAlgorithm::SHA224, key) >> streamSink(os224);
173 auto sig = os224.buf();
174 BOOST_CHECK_EQUAL_COLLECTIONS(sig->begin(), sig->end(), hmacSha224, hmacSha224 + sizeof(hmacSha224));
175
176 OBufferStream os256;
177 bufferSource(data) >> signerFilter(DigestAlgorithm::SHA256, key) >> streamSink(os256);
178 sig = os256.buf();
179 BOOST_CHECK_EQUAL_COLLECTIONS(sig->begin(), sig->end(), hmacSha256, hmacSha256 + sizeof(hmacSha256));
180
181 OBufferStream os384;
182 bufferSource(data) >> signerFilter(DigestAlgorithm::SHA384, key) >> streamSink(os384);
183 sig = os384.buf();
184 BOOST_CHECK_EQUAL_COLLECTIONS(sig->begin(), sig->end(), hmacSha384, hmacSha384 + sizeof(hmacSha384));
185
186 OBufferStream os512;
187 bufferSource(data) >> signerFilter(DigestAlgorithm::SHA512, key) >> streamSink(os512);
188 sig = os512.buf();
189 BOOST_CHECK_EQUAL_COLLECTIONS(sig->begin(), sig->end(), hmacSha512, hmacSha512 + sizeof(hmacSha512));
Laqin Fan0fe72ea2019-05-22 16:42:59 -0500190}
191
Davide Pesavento5e494c02019-09-29 16:30:19 -0400192BOOST_AUTO_TEST_CASE(Rfc4231Test2)
Laqin Fan0fe72ea2019-05-22 16:42:59 -0500193{
Davide Pesavento5e494c02019-09-29 16:30:19 -0400194 // Test case 2 (HMAC-SHA-256 only)
195 const char rawKey[] = "Jefe";
196 const std::string data("what do ya want for nothing?");
197 const uint8_t hmacSha256[] = {0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04,
198 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08,
199 0x9d, 0x27, 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec,
200 0x38, 0x43};
Laqin Fan0fe72ea2019-05-22 16:42:59 -0500201
Davide Pesavento5e494c02019-09-29 16:30:19 -0400202 PrivateKey key;
Davide Pesavento765abc92021-12-27 00:44:04 -0500203 key.loadRaw(KeyType::HMAC, {reinterpret_cast<const uint8_t*>(rawKey), std::strlen(rawKey)});
Davide Pesavento5e494c02019-09-29 16:30:19 -0400204
205 OBufferStream os256;
206 bufferSource(data) >> signerFilter(DigestAlgorithm::SHA256, key) >> streamSink(os256);
207 auto sig = os256.buf();
208 BOOST_CHECK_EQUAL_COLLECTIONS(sig->begin(), sig->end(), hmacSha256, hmacSha256 + sizeof(hmacSha256));
Yingdi Yub263f152015-07-12 16:50:13 -0700209}
210
Davide Pesavento5e494c02019-09-29 16:30:19 -0400211BOOST_AUTO_TEST_CASE(Rfc4231Test3)
212{
213 // Test case 3 (HMAC-SHA-256 only)
214 const uint8_t rawKey[] = {0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
215 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa};
216 const uint8_t data[] = {0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
217 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
218 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
219 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
220 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd};
221 const uint8_t hmacSha256[] = {0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d,
222 0xb8, 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b,
223 0x3e, 0xf8, 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5,
224 0x65, 0xfe};
225
226 PrivateKey key;
Davide Pesavento765abc92021-12-27 00:44:04 -0500227 key.loadRaw(KeyType::HMAC, rawKey);
Davide Pesavento5e494c02019-09-29 16:30:19 -0400228
229 OBufferStream os256;
Davide Pesavento765abc92021-12-27 00:44:04 -0500230 bufferSource(data) >> signerFilter(DigestAlgorithm::SHA256, key) >> streamSink(os256);
Davide Pesavento5e494c02019-09-29 16:30:19 -0400231 auto sig = os256.buf();
232 BOOST_CHECK_EQUAL_COLLECTIONS(sig->begin(), sig->end(), hmacSha256, hmacSha256 + sizeof(hmacSha256));
233}
234
235BOOST_AUTO_TEST_SUITE_END() // Hmac
236
Davide Pesavento06f1bdf2017-09-16 18:59:15 -0400237BOOST_AUTO_TEST_CASE(InvalidKey)
238{
Davide Pesavento5e494c02019-09-29 16:30:19 -0400239 PrivateKey key;
240 BOOST_CHECK_THROW(SignerFilter(DigestAlgorithm::SHA256, key), Error);
Davide Pesavento06f1bdf2017-09-16 18:59:15 -0400241}
242
Yingdi Yub263f152015-07-12 16:50:13 -0700243BOOST_AUTO_TEST_SUITE_END() // TestSignerFilter
244BOOST_AUTO_TEST_SUITE_END() // Transform
245BOOST_AUTO_TEST_SUITE_END() // Security
246
247} // namespace tests
248} // namespace transform
249} // namespace security
250} // namespace ndn