blob: 5f29a034cf5b6afbd4faa31356f79947c235b20e [file] [log] [blame]
Zhiyi Zhang63589b82020-10-10 10:27:09 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2017-2020, Regents of the University of California.
4 *
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 "detail/crypto-helpers.hpp"
22#include "test-common.hpp"
23
24namespace ndn {
25namespace ndncert {
26namespace tests {
27
28BOOST_AUTO_TEST_SUITE(TestCryptoHelpers)
29
30BOOST_AUTO_TEST_CASE(EcdhWithRawKey)
31{
32 ECDHState aliceState;
33 auto alicePub = aliceState.getSelfPubKey();
34 BOOST_CHECK(!alicePub.empty());
35
36 ECDHState bobState;
37 auto bobPub = bobState.getSelfPubKey();
38 BOOST_CHECK(!bobPub.empty());
39
40 auto aliceResult = aliceState.deriveSecret(bobPub);
41 BOOST_CHECK(!aliceResult.empty());
42 auto bobResult = bobState.deriveSecret(alicePub);
43 BOOST_CHECK(!bobResult.empty());
44 BOOST_CHECK_EQUAL_COLLECTIONS(aliceResult.begin(), aliceResult.end(), bobResult.begin(), bobResult.end());
45}
46
47BOOST_AUTO_TEST_CASE(EcdhWithRawKeyWrongInput)
48{
49 ECDHState aliceState;
50 auto alicePub = aliceState.getSelfPubKey();
51 BOOST_CHECK(!alicePub.empty());
52 std::vector<uint8_t> fakePub(10, 0x0b);
53 BOOST_CHECK_THROW(aliceState.deriveSecret(fakePub), std::runtime_error);
54}
55
56BOOST_AUTO_TEST_CASE(HmacSha256)
57{
58 const uint8_t input[] = {0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
59 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
60 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
61 const uint8_t key[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
62 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c};
63 const uint8_t expected[] = {0x07, 0x77, 0x09, 0x36, 0x2c, 0x2e, 0x32, 0xdf,
64 0x0d, 0xdc, 0x3f, 0x0d, 0xc4, 0x7b, 0xba, 0x63,
65 0x90, 0xb6, 0xc7, 0x3b, 0xb5, 0x0f, 0x9c, 0x31,
66 0x22, 0xec, 0x84, 0x4a, 0xd7, 0xc2, 0xb3, 0xe5};
67 uint8_t result[32];
68 hmacSha256(input, sizeof(input), key, sizeof(key), result);
69 BOOST_CHECK_EQUAL_COLLECTIONS(result, result + sizeof(result), expected,
70 expected + sizeof(expected));
71}
72
73BOOST_AUTO_TEST_CASE(Hkdf1)
74{
75 // RFC5869 appendix A.1
76 const uint8_t ikm[] = {0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
77 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
78 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
79 const uint8_t salt[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
80 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c};
81 const uint8_t info[] = {0xf0, 0xf1, 0xf2, 0xf3, 0xf4,
82 0xf5, 0xf6, 0xf7, 0xf8, 0xf9};
83 const uint8_t expected[] = {
84 0x3c, 0xb2, 0x5f, 0x25, 0xfa, 0xac, 0xd5, 0x7a, 0x90, 0x43, 0x4f,
85 0x64, 0xd0, 0x36, 0x2f, 0x2a, 0x2d, 0x2d, 0x0a, 0x90, 0xcf, 0x1a,
86 0x5a, 0x4c, 0x5d, 0xb0, 0x2d, 0x56, 0xec, 0xc4, 0xc5, 0xbf, 0x34,
87 0x00, 0x72, 0x08, 0xd5, 0xb8, 0x87, 0x18, 0x58, 0x65};
88 uint8_t result[42];
89 auto resultLen = hkdf(ikm, sizeof(ikm), salt, sizeof(salt), result,
90 sizeof(result), info, sizeof(info));
91
92 BOOST_CHECK_EQUAL(resultLen, sizeof(result));
93 BOOST_CHECK_EQUAL_COLLECTIONS(result, result + sizeof(result), expected,
94 expected + sizeof(expected));
95}
96
97BOOST_AUTO_TEST_CASE(Hkdf2)
98{
99 // RFC5869 appendix A.2
100 const uint8_t ikm[] = {
101 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
102 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
103 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
104 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
105 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
106 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
107 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f};
108 const uint8_t salt[] = {
109 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
110 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
111 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
112 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
113 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
114 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
115 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf};
116 const uint8_t info[] = {
117 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb,
118 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
119 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3,
120 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
121 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
122 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
123 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff};
124 const uint8_t expected[] = {
125 0xb1, 0x1e, 0x39, 0x8d, 0xc8, 0x03, 0x27, 0xa1, 0xc8, 0xe7, 0xf7, 0x8c,
126 0x59, 0x6a, 0x49, 0x34, 0x4f, 0x01, 0x2e, 0xda, 0x2d, 0x4e, 0xfa, 0xd8,
127 0xa0, 0x50, 0xcc, 0x4c, 0x19, 0xaf, 0xa9, 0x7c, 0x59, 0x04, 0x5a, 0x99,
128 0xca, 0xc7, 0x82, 0x72, 0x71, 0xcb, 0x41, 0xc6, 0x5e, 0x59, 0x0e, 0x09,
129 0xda, 0x32, 0x75, 0x60, 0x0c, 0x2f, 0x09, 0xb8, 0x36, 0x77, 0x93, 0xa9,
130 0xac, 0xa3, 0xdb, 0x71, 0xcc, 0x30, 0xc5, 0x81, 0x79, 0xec, 0x3e, 0x87,
131 0xc1, 0x4c, 0x01, 0xd5, 0xc1, 0xf3, 0x43, 0x4f, 0x1d, 0x87};
132
133 uint8_t result[82];
134 auto resultLen = hkdf(ikm, sizeof(ikm), salt, sizeof(salt), result,
135 sizeof(result), info, sizeof(info));
136
137 BOOST_CHECK_EQUAL(resultLen, sizeof(result));
138 BOOST_CHECK_EQUAL_COLLECTIONS(result, result + sizeof(result), expected,
139 expected + sizeof(expected));
140}
141
142BOOST_AUTO_TEST_CASE(Hkdf3)
143{
144 // RFC5869 appendix A.3
145 const uint8_t ikm[] = {0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
146 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
147 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
148 const uint8_t expected[] = {
149 0x8d, 0xa4, 0xe7, 0x75, 0xa5, 0x63, 0xc1, 0x8f, 0x71, 0x5f, 0x80,
150 0x2a, 0x06, 0x3c, 0x5a, 0x31, 0xb8, 0xa1, 0x1f, 0x5c, 0x5e, 0xe1,
151 0x87, 0x9e, 0xc3, 0x45, 0x4e, 0x5f, 0x3c, 0x73, 0x8d, 0x2d, 0x9d,
152 0x20, 0x13, 0x95, 0xfa, 0xa4, 0xb6, 0x1a, 0x96, 0xc8};
153 uint8_t result[42];
154
155 auto resultLen = hkdf(ikm, sizeof(ikm), nullptr, 0, result,
156 sizeof(result), nullptr, 0);
157
158 BOOST_CHECK_EQUAL(resultLen, sizeof(result));
159 BOOST_CHECK_EQUAL_COLLECTIONS(result, result + sizeof(result), expected,
160 expected + sizeof(expected));
161}
162
163BOOST_AUTO_TEST_CASE(AesGcm1)
164{
165 // Test case from NIST Cryptographic Algorithm Validation Program
166 // https://csrc.nist.gov/Projects/cryptographic-algorithm-validation-program/CAVP-TESTING-BLOCK-CIPHER-MODES
167 // Count = 0
168 // Key = cf063a34d4a9a76c2c86787d3f96db71
169 // IV = 113b9785971864c83b01c787
170 // CT =
171 // AAD =
172 // Tag = 72ac8493e3a5228b5d130a69d2510e42
173 // PT =
174 const uint8_t key[] = {0xcf, 0x06, 0x3a, 0x34, 0xd4, 0xa9, 0xa7, 0x6c,
175 0x2c, 0x86, 0x78, 0x7d, 0x3f, 0x96, 0xdb, 0x71};
176 const uint8_t iv[] = {0x11, 0x3b, 0x97, 0x85, 0x97, 0x18,
177 0x64, 0xc8, 0x3b, 0x01, 0xc7, 0x87};
178 const uint8_t expected_tag[] = {0x72, 0xac, 0x84, 0x93, 0xe3, 0xa5,
179 0x22, 0x8b, 0x5d, 0x13, 0x0a, 0x69,
180 0xd2, 0x51, 0x0e, 0x42};
181
182 uint8_t ciphertext[256] = {0};
183 uint8_t tag[16] = {0};
184 const uint8_t empty_buffer[1] = {0};
185 int size = aesGcm128Encrypt(empty_buffer, 0, empty_buffer, 0, key, iv, ciphertext, tag);
186 BOOST_CHECK(size == 0);
187 BOOST_CHECK_EQUAL_COLLECTIONS(tag, tag + 16, expected_tag, expected_tag + sizeof(expected_tag));
188
189 uint8_t decrypted[256] = {0};
190 size = aesGcm128Decrypt(ciphertext, size, empty_buffer, 0, tag, key, iv, decrypted);
191 BOOST_CHECK(size == 0);
192}
193
194BOOST_AUTO_TEST_CASE(AesGcm2)
195{
196 // Test case from NIST Cryptographic Algorithm Validation Program
197 // https://csrc.nist.gov/Projects/cryptographic-algorithm-validation-program/CAVP-TESTING-BLOCK-CIPHER-MODES
198 // Count = 1
199 // Key = 2370e320d4344208e0ff5683f243b213
200 // IV = 04dbb82f044d30831c441228
201 // CT =
202 // AAD = d43a8e5089eea0d026c03a85178b27da
203 // Tag = 2a049c049d25aa95969b451d93c31c6e
204 // PT =
205 const uint8_t key[] = {0x23, 0x70, 0xe3, 0x20, 0xd4, 0x34, 0x42, 0x08,
206 0xe0, 0xff, 0x56, 0x83, 0xf2, 0x43, 0xb2, 0x13};
207 const uint8_t iv[] = {0x04, 0xdb, 0xb8, 0x2f, 0x04, 0x4d,
208 0x30, 0x83, 0x1c, 0x44, 0x12, 0x28};
209 const uint8_t aad[] = {0xd4, 0x3a, 0x8e, 0x50, 0x89, 0xee, 0xa0, 0xd0,
210 0x26, 0xc0, 0x3a, 0x85, 0x17, 0x8b, 0x27, 0xda};
211 const uint8_t expected_tag[] = {0x2a, 0x04, 0x9c, 0x04, 0x9d, 0x25,
212 0xaa, 0x95, 0x96, 0x9b, 0x45, 0x1d,
213 0x93, 0xc3, 0x1c, 0x6e};
214
215 uint8_t ciphertext[256] = {0};
216 uint8_t tag[16] = {0};
217 const uint8_t empty_buffer[1] = {0};
218 int size = aesGcm128Encrypt(empty_buffer, 0, aad, sizeof(aad), key, iv, ciphertext, tag);
219 BOOST_CHECK(size == 0);
220 BOOST_CHECK_EQUAL_COLLECTIONS(tag, tag + 16, expected_tag, expected_tag + sizeof(expected_tag));
221
222 uint8_t decrypted[256] = {0};
223 size = aesGcm128Decrypt(ciphertext, size, aad, sizeof(aad), tag, key, iv, decrypted);
224 BOOST_CHECK(size == 0);
225}
226
227BOOST_AUTO_TEST_CASE(AesGcm3)
228{
229 // Test case from NIST Cryptographic Algorithm Validation Program
230 // https://csrc.nist.gov/Projects/cryptographic-algorithm-validation-program/CAVP-TESTING-BLOCK-CIPHER-MODES
231 // Count = 0
232 // Key = bc22f3f05cc40db9311e4192966fee92
233 // IV = 134988e662343c06d3ab83db
234 // CT = 4c0168ab95d3a10ef25e5924108389365c67d97778995892d9fd46897384af61fc559212b3267e90fe4df7bfd1fbed46f4b9ee
235 // AAD = 10087e6ed81049b509c31d12fee88c64
236 // Tag = 771357958a316f166bd0dacc98ea801a
237 // PT = 337c1bc992386cf0f957617fe4d5ec1218ae1cc40369305518eb177e9b15c1646b142ff71237efaa58790080cd82e8848b295c
238 const uint8_t key[] = {0xbc, 0x22, 0xf3, 0xf0, 0x5c, 0xc4, 0x0d, 0xb9,
239 0x31, 0x1e, 0x41, 0x92, 0x96, 0x6f, 0xee, 0x92};
240 const uint8_t iv[] = {0x13, 0x49, 0x88, 0xe6, 0x62, 0x34,
241 0x3c, 0x06, 0xd3, 0xab, 0x83, 0xdb};
242 const uint8_t aad[] = {0x10, 0x08, 0x7e, 0x6e, 0xd8, 0x10, 0x49, 0xb5,
243 0x09, 0xc3, 0x1d, 0x12, 0xfe, 0xe8, 0x8c, 0x64};
244 const uint8_t expected_ciphertext[] = {
245 0x4c, 0x01, 0x68, 0xab, 0x95, 0xd3, 0xa1, 0x0e, 0xf2, 0x5e, 0x59,
246 0x24, 0x10, 0x83, 0x89, 0x36, 0x5c, 0x67, 0xd9, 0x77, 0x78, 0x99,
247 0x58, 0x92, 0xd9, 0xfd, 0x46, 0x89, 0x73, 0x84, 0xaf, 0x61, 0xfc,
248 0x55, 0x92, 0x12, 0xb3, 0x26, 0x7e, 0x90, 0xfe, 0x4d, 0xf7, 0xbf,
249 0xd1, 0xfb, 0xed, 0x46, 0xf4, 0xb9, 0xee};
250 const uint8_t expected_tag[] = {0x77, 0x13, 0x57, 0x95, 0x8a, 0x31,
251 0x6f, 0x16, 0x6b, 0xd0, 0xda, 0xcc,
252 0x98, 0xea, 0x80, 0x1a};
253 const uint8_t plaintext[] = {
254 0x33, 0x7c, 0x1b, 0xc9, 0x92, 0x38, 0x6c, 0xf0, 0xf9, 0x57, 0x61,
255 0x7f, 0xe4, 0xd5, 0xec, 0x12, 0x18, 0xae, 0x1c, 0xc4, 0x03, 0x69,
256 0x30, 0x55, 0x18, 0xeb, 0x17, 0x7e, 0x9b, 0x15, 0xc1, 0x64, 0x6b,
257 0x14, 0x2f, 0xf7, 0x12, 0x37, 0xef, 0xaa, 0x58, 0x79, 0x00, 0x80,
258 0xcd, 0x82, 0xe8, 0x84, 0x8b, 0x29, 0x5c};
259
260 uint8_t ciphertext[256] = {0};
261 uint8_t tag[16] = {0};
262 int size = aesGcm128Encrypt(plaintext, sizeof(plaintext), aad, sizeof(aad), key, iv, ciphertext, tag);
263 BOOST_CHECK_EQUAL_COLLECTIONS(ciphertext, ciphertext + size,
264 expected_ciphertext, expected_ciphertext + sizeof(expected_ciphertext));
265 BOOST_CHECK_EQUAL_COLLECTIONS(tag, tag + 16, expected_tag, expected_tag + sizeof(expected_tag));
266
267 uint8_t decrypted[256] = {0};
268 size = aesGcm128Decrypt(ciphertext, size, aad, sizeof(aad), tag, key, iv, decrypted);
269 BOOST_CHECK_EQUAL_COLLECTIONS(decrypted, decrypted + size,
270 plaintext, plaintext + sizeof(plaintext));
271}
272
273BOOST_AUTO_TEST_CASE(AesIV)
274{
275 const uint8_t key[] = {0xbc, 0x22, 0xf3, 0xf0, 0x5c, 0xc4, 0x0d, 0xb9,
276 0x31, 0x1e, 0x41, 0x92, 0x96, 0x6f, 0xee, 0x92};
277 const std::string plaintext = "alongstringalongstringalongstringalongstringalongstringalongstringalongstringalongstring";
278 const std::string associatedData = "test";
279 uint32_t counter = 0;
280 auto block = encodeBlockWithAesGcm128(ndn::tlv::Content, key, (uint8_t*)plaintext.c_str(), plaintext.size(),
281 (uint8_t*)associatedData.c_str(), associatedData.size(), counter);
282 block.parse();
283 auto ivBlock = block.get(tlv::InitializationVector);
284 Buffer ivBuf(ivBlock.value(), ivBlock.value_size());
285 BOOST_CHECK_EQUAL(ivBuf.size(), 12);
286 BOOST_CHECK(ivBuf[0] >= 128);
287 BOOST_CHECK_EQUAL(ivBuf[8] + ivBuf[9] + ivBuf[10] + ivBuf[11], 0);
288 BOOST_CHECK_EQUAL(counter, 6);
289 counter = 300;
290 block = encodeBlockWithAesGcm128(ndn::tlv::ApplicationParameters, key, (uint8_t*)plaintext.c_str(), plaintext.size(),
291 (uint8_t*)associatedData.c_str(), associatedData.size(), counter);
292 block.parse();
293 ivBlock = block.get(tlv::InitializationVector);
294 Buffer ivBuf2(ivBlock.value(), ivBlock.value_size());
295 BOOST_CHECK_EQUAL(ivBuf2.size(), 12);
296 BOOST_CHECK(ivBuf2[0] < 128);
297 BOOST_CHECK_EQUAL(ivBuf2[8] + ivBuf2[9], 0);
298 BOOST_CHECK_EQUAL(ivBuf2[10], 1);
299 BOOST_CHECK_EQUAL(ivBuf2[11], 44);
300 BOOST_CHECK_EQUAL(counter, 306);
301}
302
303BOOST_AUTO_TEST_CASE(BlockEncodingDecoding)
304{
305 const uint8_t key[] = {0xbc, 0x22, 0xf3, 0xf0, 0x5c, 0xc4, 0x0d, 0xb9,
306 0x31, 0x1e, 0x41, 0x92, 0x96, 0x6f, 0xee, 0x92};
307 const std::string plaintext = "alongstringalongstringalongstringalongstringalongstringalongstringalongstringalongstring";
308 const std::string plaintext2 = "shortstring";
309 const std::string associatedData = "right";
310 const std::string wrongAssociatedData = "wrong";
311 uint32_t counter = 0;
312 // long string encryption
313 auto block = encodeBlockWithAesGcm128(ndn::tlv::Content, key, (uint8_t*)plaintext.c_str(), plaintext.size(),
314 (uint8_t*)associatedData.c_str(), associatedData.size(), counter);
315 auto decoded = decodeBlockWithAesGcm128(block, key, (uint8_t*)associatedData.c_str(), associatedData.size());
316 BOOST_CHECK_EQUAL(plaintext, std::string(decoded.get<char>(), decoded.size()));
317
318 // short string encryption
319 block = encodeBlockWithAesGcm128(ndn::tlv::Content, key, (uint8_t*)plaintext2.c_str(), plaintext2.size(),
320 (uint8_t*)associatedData.c_str(), associatedData.size(), counter);
321 decoded = decodeBlockWithAesGcm128(block, key, (uint8_t*)associatedData.c_str(), associatedData.size());
322 BOOST_CHECK_EQUAL(plaintext2, std::string(decoded.get<char>(), decoded.size()));
323
324 // use wrong associated data
325 BOOST_CHECK_THROW(decodeBlockWithAesGcm128(block, key,
326 (uint8_t*)wrongAssociatedData.c_str(),
327 wrongAssociatedData.size()), std::runtime_error);
328}
329
330BOOST_AUTO_TEST_SUITE_END()
331
332} // namespace tests
333} // namespace ndncert
334} // namespace ndn