blob: 262f2acd9b3b502c24813a62e2ea216379bc1323 [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -08002/**
Spyridon Mastorakis429634f2015-02-19 17:35:33 -08003 * Copyright (c) 2013-2015 Regents of the University of California.
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07006 *
Alexander Afanasyevc169a812014-05-20 20:37:29 -04007 * 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.
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080020 */
21
Alexander Afanasyev09c613f2014-01-29 00:23:58 -080022#include "data.hpp"
23#include "security/key-chain.hpp"
Junxiao Shi482ccc52014-03-31 13:05:24 -070024#include "security/cryptopp.hpp"
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -070025#include "encoding/buffer-stream.hpp"
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080026
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070027#include "boost-test.hpp"
28
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -080029namespace ndn {
Spyridon Mastorakis429634f2015-02-19 17:35:33 -080030namespace tests {
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080031
32BOOST_AUTO_TEST_SUITE(TestData)
33
34const uint8_t Content1[] = {0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21};
35
36const uint8_t Data1[] = {
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700370x06, 0xc5, // NDN Data
38 0x07, 0x14, // Name
39 0x08, 0x05,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080040 0x6c, 0x6f, 0x63, 0x61, 0x6c,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070041 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080042 0x6e, 0x64, 0x6e,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070043 0x08, 0x06,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080044 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080045 0x14, 0x04, // MetaInfo
46 0x19, 0x02, // FreshnessPeriod
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070047 0x27, 0x10,
48 0x15, 0x08, // Content
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080049 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080050 0x16, 0x1b, // SignatureInfo
51 0x1b, 0x01, // SignatureType
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070052 0x01,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080053 0x1c, 0x16, // KeyLocator
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070054 0x07, 0x14, // Name
55 0x08, 0x04,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080056 0x74, 0x65, 0x73, 0x74,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070057 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080058 0x6b, 0x65, 0x79,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070059 0x08, 0x07,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080060 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080061 0x17, 0x80, // SignatureValue
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070062 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
63 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
64 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
65 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
66 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
67 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
68 0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
69 0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
70 0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
71 0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080072};
73
74const unsigned char DEFAULT_PRIVATE_KEY_DER[] = {
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070075 0x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,
76 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82,
77 0x02, 0x5a, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e, 0x47, 0x85,
78 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47, 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05,
79 0x3a, 0x24, 0x1e, 0xeb, 0x89, 0x01, 0xbb, 0xe9, 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68,
80 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7, 0x06, 0x90, 0x9c, 0xaa,
81 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3, 0x1b, 0x88,
82 0x9a, 0x97, 0x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82,
83 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d, 0x24, 0xc2, 0x63, 0xf3, 0x97, 0x17,
84 0xeb, 0xfe, 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f,
85 0xb8, 0xf2, 0xf1, 0xc5, 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed,
86 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76, 0x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11,
87 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0, 0x2a, 0xe3, 0x6b, 0x0c, 0x8b, 0x73,
88 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c, 0x5b, 0x43, 0x29, 0xad,
89 0x3a, 0x3b, 0x93, 0xa3, 0x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e, 0x33, 0x3f,
90 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44, 0x00, 0xde, 0x72, 0xed,
91 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2,
92 0x69, 0x1f, 0xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13,
93 0x06, 0x69, 0x06, 0xd8, 0x3f, 0x22, 0x15, 0x75, 0xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66,
94 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2, 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37,
95 0x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88, 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f,
96 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02, 0x41, 0x00, 0xb6, 0x2e, 0xbb, 0xcd, 0x2f, 0x3a,
97 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e, 0x64, 0xa7,
98 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae,
99 0xb0, 0x74, 0xa6, 0x99, 0xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e,
100 0x56, 0xad, 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c, 0xb7, 0x9a, 0x3e, 0x99,
101 0xef, 0xb9, 0x02, 0x41, 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1,
102 0xac, 0xee, 0xcb, 0x41, 0x81, 0xc6, 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21,
103 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96, 0x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8,
104 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6, 0x90, 0xb5, 0xce, 0x1b,
105 0x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a, 0x7f, 0x02,
106 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0, 0x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89,
107 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee, 0x51, 0x57,
108 0xd5, 0x97, 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e,
109 0x88, 0x63, 0xe2, 0x66, 0x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a,
110 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca, 0x78, 0xab, 0x21, 0x02, 0x41, 0x00, 0x8f, 0xae,
111 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24, 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81,
112 0xbc, 0x2c, 0x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d, 0x28, 0xd9, 0x10, 0x1a,
113 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14, 0xbf, 0xc9, 0xff, 0x17, 0xd6, 0x47,
114 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
115 0xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a,
116 0x33, 0x2f, 0x4b, 0xa2, 0xbd, 0xd1, 0xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15,
117 0x37, 0x1b, 0xde, 0x76, 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9, 0x4f, 0x35,
118 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95, 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21,
119 0x6d, 0xa0, 0x84, 0x39, 0xe9, 0x2e, 0x1e, 0xfc, 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d,
120 0x0a, 0xb6
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800121};
122
Jiewen Tanc759a202015-01-29 23:31:09 -0800123const uint8_t DataWithLocalControlHeader[] = {
124 0x50, 0x29, 0x53, 0x02, 0x60, 0x00,
125 0x06, 0x23, 0x07, 0x03, 0x08, 0x01, 0x41, 0x14, 0x04, 0x19, 0x02, 0x27, 0x10, 0x15,
126 0x09, 0x73, 0x6F, 0x6D, 0x65, 0x44, 0x61, 0x74, 0x61, 0x00, 0x16, 0x05, 0x1B, 0x01,
127 0x01, 0x1C, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x00
128};
129
130const uint8_t DataWithoutLocalControlHeader[] = {
131 0x06, 0x23, 0x07, 0x03, 0x08, 0x01, 0x41, 0x14, 0x04, 0x19, 0x02, 0x27, 0x10, 0x15,
132 0x09, 0x73, 0x6F, 0x6D, 0x65, 0x44, 0x61, 0x74, 0x61, 0x00, 0x16, 0x05, 0x1B, 0x01,
133 0x01, 0x1C, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x00
134};
135
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700136BOOST_AUTO_TEST_CASE(DataEqualityChecks)
137{
138 using namespace time;
139
140 Data a;
141 Data b;
142 BOOST_CHECK_EQUAL(a == b, true);
143 BOOST_CHECK_EQUAL(a != b, false);
144
145 a.setName("ndn:/A");
146 BOOST_CHECK_EQUAL(a == b, false);
147 BOOST_CHECK_EQUAL(a != b, true);
148
149 b.setName("ndn:/B");
150 BOOST_CHECK_EQUAL(a == b, false);
151 BOOST_CHECK_EQUAL(a != b, true);
152
153 b.setName("ndn:/A");
154 BOOST_CHECK_EQUAL(a == b, true);
155 BOOST_CHECK_EQUAL(a != b, false);
156
157 a.setFreshnessPeriod(seconds(10));
158 BOOST_CHECK_EQUAL(a == b, false);
159 BOOST_CHECK_EQUAL(a != b, true);
160
161 b.setFreshnessPeriod(seconds(10));
162 BOOST_CHECK_EQUAL(a == b, true);
163 BOOST_CHECK_EQUAL(a != b, false);
164
165 static const uint8_t someData[] = "someData";
166 a.setContent(someData, sizeof(someData));
167 BOOST_CHECK_EQUAL(a == b, false);
168 BOOST_CHECK_EQUAL(a != b, true);
169
170 b.setContent(someData, sizeof(someData));
171 BOOST_CHECK_EQUAL(a == b, true);
172 BOOST_CHECK_EQUAL(a != b, false);
173
174 a.setSignature(SignatureSha256WithRsa());
175 BOOST_CHECK_EQUAL(a == b, false);
176 BOOST_CHECK_EQUAL(a != b, true);
177
178 b.setSignature(SignatureSha256WithRsa());
179 BOOST_CHECK_EQUAL(a == b, true);
180 BOOST_CHECK_EQUAL(a != b, false);
181}
182
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700183BOOST_AUTO_TEST_CASE(SignatureEqualityChecks)
184{
185 Signature a;
186 Signature b;
187
188 BOOST_CHECK_EQUAL(a == b, true);
189 BOOST_CHECK_EQUAL(a != b, false);
190
191 a = SignatureSha256WithRsa();
192 BOOST_CHECK_EQUAL(a == b, false);
193 BOOST_CHECK_EQUAL(a != b, true);
194
195 b = SignatureSha256WithRsa();
196 static const uint8_t someData[256] = {};
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600197 Block signatureValue = dataBlock(tlv::SignatureValue, someData, sizeof(someData));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700198 b.setValue(signatureValue);
199 BOOST_CHECK_EQUAL(a == b, false);
200 BOOST_CHECK_EQUAL(a != b, true);
201
202 a.setValue(signatureValue);
203 BOOST_CHECK_EQUAL(a == b, true);
204 BOOST_CHECK_EQUAL(a != b, false);
205
Yingdi Yubf6a2812014-06-17 15:32:11 -0700206 a = DigestSha256();
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700207 b = SignatureSha256WithRsa();
208 BOOST_CHECK_EQUAL(a == b, false);
209 BOOST_CHECK_EQUAL(a != b, true);
210
Yingdi Yubf6a2812014-06-17 15:32:11 -0700211 b = DigestSha256();
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700212 BOOST_CHECK_EQUAL(a == b, true);
213 BOOST_CHECK_EQUAL(a != b, false);
214}
215
Jiewen Tanc759a202015-01-29 23:31:09 -0800216BOOST_AUTO_TEST_CASE(EncodeWithLocalHeader)
217{
218 Data data("ndn:/A");
219 data.setFreshnessPeriod(time::seconds(10));
220 static const uint8_t someData[] = "someData";
221 data.setContent(someData, sizeof(someData));
222 data.setSignature(SignatureSha256WithRsa());
223 data.setCachingPolicy(nfd::LocalControlHeader::CachingPolicy::NO_CACHE);
224
225 BOOST_CHECK(!data.hasWire());
226
227 Block headerBlock =
228 data.getLocalControlHeader().wireEncode(data, nfd::LocalControlHeader::ENCODE_CACHING_POLICY);
229
230 BOOST_CHECK(data.hasWire());
231 BOOST_CHECK(headerBlock.hasWire());
232
233 BOOST_CHECK_NE(headerBlock.wire(), data.wireEncode().wire());
234 BOOST_CHECK_NE(headerBlock.size(), data.wireEncode().size());
235 BOOST_CHECK_EQUAL(headerBlock.size(), 6);
236
237 BOOST_CHECK_EQUAL_COLLECTIONS(DataWithLocalControlHeader,
238 DataWithLocalControlHeader + 6,
239 headerBlock.begin(), headerBlock.end());
240
241 data.setFreshnessPeriod(time::seconds(1000));
242
243 Block updatedHeaderBlock = data.getLocalControlHeader()
244 .wireEncode(data, nfd::LocalControlHeader::ENCODE_CACHING_POLICY);
245 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 6);
246
247 // only length should have changed
248 BOOST_CHECK_EQUAL_COLLECTIONS(updatedHeaderBlock.begin() + 2, updatedHeaderBlock.end(),
249 headerBlock.begin() + 2, headerBlock.end());
250
251 // adding IncomingFaceId
252 data.setIncomingFaceId(10);
253 updatedHeaderBlock =
254 data.getLocalControlHeader().wireEncode(data, nfd::LocalControlHeader::ENCODE_INCOMING_FACE_ID
255 | nfd::LocalControlHeader::ENCODE_CACHING_POLICY);
256 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 9);
257
258 // masking CachingPolicy
259 updatedHeaderBlock = data.getLocalControlHeader()
260 .wireEncode(data, nfd::LocalControlHeader::ENCODE_INCOMING_FACE_ID);
261 BOOST_CHECK_EQUAL(updatedHeaderBlock.size(), 5);
262
263 // masking everything
264 BOOST_CHECK_THROW(data.getLocalControlHeader()
265 .wireEncode(data, nfd::LocalControlHeader::ENCODE_NONE),
266 nfd::LocalControlHeader::Error);
267}
268
269BOOST_AUTO_TEST_CASE(DecodeWithLocalHeader)
270{
271 Block wireBlock(DataWithLocalControlHeader, sizeof(DataWithLocalControlHeader));
272 const Block& payload = nfd::LocalControlHeader::getPayload(wireBlock);
273 BOOST_REQUIRE_NE(&payload, &wireBlock);
274
275 BOOST_CHECK_EQUAL(payload.type(), static_cast<uint32_t>(tlv::Data));
276 BOOST_CHECK_EQUAL(wireBlock.type(), static_cast<uint32_t>(tlv::nfd::LocalControlHeader));
277
278 Data data(payload);
279 BOOST_CHECK(!data.getLocalControlHeader().hasCachingPolicy());
280 BOOST_CHECK(!data.getLocalControlHeader().hasIncomingFaceId());
281
282 data.getLocalControlHeader().wireDecode(wireBlock);
283
284 BOOST_CHECK_EQUAL(data.getLocalControlHeader()
285 .wireEncode(data, nfd::LocalControlHeader::ENCODE_CACHING_POLICY).size(),
286 6);
287
288 BOOST_CHECK(data.getLocalControlHeader().hasCachingPolicy());
289 BOOST_CHECK(!data.getLocalControlHeader().hasIncomingFaceId());
290
291 BOOST_CHECK_THROW(data.getLocalControlHeader()
292 .wireEncode(data, nfd::LocalControlHeader::ENCODE_NONE),
293 nfd::LocalControlHeader::Error);
294
295 BOOST_CHECK_THROW(data.getLocalControlHeader()
296 .wireEncode(data, nfd::LocalControlHeader::ENCODE_INCOMING_FACE_ID),
297 nfd::LocalControlHeader::Error);
298
299 BOOST_CHECK_NO_THROW(data.getLocalControlHeader()
300 .wireEncode(data, nfd::LocalControlHeader::ENCODE_CACHING_POLICY));
301 BOOST_CHECK_NO_THROW(
302 data.getLocalControlHeader().wireEncode(data, nfd::LocalControlHeader::ENCODE_INCOMING_FACE_ID |
303 nfd::LocalControlHeader::ENCODE_CACHING_POLICY));
304
305 BOOST_CHECK_NE((void*)data.getLocalControlHeader()
306 .wireEncode(data, nfd::LocalControlHeader::ENCODE_INCOMING_FACE_ID |
307 nfd::LocalControlHeader::ENCODE_CACHING_POLICY)
308 .wire(),
309 (void*)wireBlock.wire());
310
311 BOOST_CHECK_EQUAL(data.getLocalControlHeader()
312 .wireEncode(data, nfd::LocalControlHeader::ENCODE_INCOMING_FACE_ID |
313 nfd::LocalControlHeader::ENCODE_CACHING_POLICY).size(),
314 6);
315}
316
317BOOST_AUTO_TEST_CASE(DecodeWithoutLocalHeader)
318{
319 Block wireBlock(DataWithoutLocalControlHeader, sizeof(DataWithoutLocalControlHeader));
320 const Block& payload = nfd::LocalControlHeader::getPayload(wireBlock);
321 BOOST_CHECK_EQUAL(&payload, &wireBlock);
322}
323
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800324class TestDataFixture
325{
326public:
327 TestDataFixture()
328 {
329 CryptoPP::StringSource source(DEFAULT_PRIVATE_KEY_DER, sizeof(DEFAULT_PRIVATE_KEY_DER), true);
330 privateKey_.Load(source);
331 publicKey_ = privateKey_;
332 }
333
334protected:
335 CryptoPP::AutoSeededRandomPool rng_;
336 CryptoPP::RSA::PrivateKey privateKey_;
337 CryptoPP::RSA::PublicKey publicKey_;
338};
339
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700340BOOST_FIXTURE_TEST_CASE(Decode, TestDataFixture)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800341{
342 Block dataBlock(Data1, sizeof(Data1));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700343
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800344 ndn::Data d;
Alexander Afanasyevafee0a52014-11-07 11:15:34 -0800345 BOOST_REQUIRE_NO_THROW(d.wireDecode(dataBlock));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800346
347 BOOST_REQUIRE_EQUAL(d.getName().toUri(), "/local/ndn/prefix");
Junxiao Shia464b922014-11-12 21:13:06 -0700348 BOOST_REQUIRE_EQUAL(d.getContentType(), static_cast<uint32_t>(tlv::ContentType_Blob));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700349 BOOST_REQUIRE_EQUAL(d.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800350
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700351 BOOST_REQUIRE_EQUAL(std::string(reinterpret_cast<const char*>(d.getContent().value()),
352 d.getContent().value_size()), "SUCCESS!");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800353
Alexander Afanasyev76c51562014-01-03 15:13:48 -0800354 BOOST_REQUIRE_EQUAL(d.getSignature().getType(), static_cast<uint32_t>(Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800355 ndn::Block block = d.getSignature().getInfo();
356 block.parse();
357 KeyLocator keyLocator;
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600358 BOOST_REQUIRE_NO_THROW(keyLocator.wireDecode(block.get(tlv::KeyLocator)));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700359
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800360 BOOST_REQUIRE_EQUAL(keyLocator.getName().toUri(), "/test/key/locator");
361
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700362 using namespace CryptoPP;
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800363 RSASS<PKCS1v15, SHA256>::Verifier verifier(publicKey_);
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700364 bool signatureVerified = verifier.VerifyMessage(d.wireEncode().value(),
365 d.wireEncode().value_size() -
366 d.getSignature().getValue().size(),
367 d.getSignature().getValue().value(),
368 d.getSignature().getValue().value_size());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800369 BOOST_REQUIRE_EQUAL(signatureVerified, true);
370}
371
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700372BOOST_FIXTURE_TEST_CASE(Encode, TestDataFixture)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800373{
374 // manual data packet creation for now
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700375
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800376 ndn::Data d(ndn::Name("/local/ndn/prefix"));
Junxiao Shia464b922014-11-12 21:13:06 -0700377 d.setContentType(tlv::ContentType_Blob);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700378 d.setFreshnessPeriod(time::seconds(10));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700379
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800380 d.setContent(Content1, sizeof(Content1));
381
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600382 Block signatureInfo(tlv::SignatureInfo);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800383 // SignatureType
384 {
Alexander Afanasyev90df0002014-01-03 15:32:43 -0800385 signatureInfo.push_back
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600386 (nonNegativeIntegerBlock(tlv::SignatureType, Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800387 }
388 // KeyLocator
389 {
390 KeyLocator keyLocator;
391 keyLocator.setName("/test/key/locator");
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700392
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800393 signatureInfo.push_back(keyLocator.wireEncode());
394 }
395 signatureInfo.encode();
396
397 // SignatureValue
398 OBufferStream os;
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600399 tlv::writeVarNumber(os, tlv::SignatureValue);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800400
401 using namespace CryptoPP;
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700402
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800403 RSASS<PKCS1v15, SHA256>::Signer signer(privateKey_);
404
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800405 PK_MessageAccumulator *hash = signer.NewSignatureAccumulator(rng_);
406 hash->Update(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
407 hash->Update(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
408 hash->Update(d.getContent(). wire(), d.getContent(). size());
409 hash->Update(signatureInfo. wire(), signatureInfo. size());
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700410
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800411 size_t length = signer.MaxSignatureLength();
412 SecByteBlock buf(length);
413 signer.Sign(rng_, hash, buf);
414
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600415 tlv::writeVarNumber(os, buf.size());
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700416 os.write(reinterpret_cast<const char *>(buf.BytePtr()), buf.size());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800417
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700418 ndn::Block signatureValue(Block(os.buf()));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700419
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800420 Signature signature(signatureInfo, signatureValue);
421
422 d.setSignature(signature);
423
424 Block dataBlock;
425 BOOST_REQUIRE_NO_THROW(dataBlock = d.wireEncode());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800426
427 BOOST_REQUIRE_EQUAL_COLLECTIONS(Data1, Data1+sizeof(Data1),
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800428 dataBlock.begin(), dataBlock.end());
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700429
430 std::ostringstream strStream;
431 BOOST_CHECK_NO_THROW(strStream << d);
432
433 BOOST_CHECK_EQUAL(strStream.str(),
434 "Name: /local/ndn/prefix\n"
435 "MetaInfo: ContentType: 0, FreshnessPeriod: 10000 milliseconds\n"
436 "Content: (size: 8)\n"
437 "Signature: (type: 1, value_length: 128)\n");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800438}
439
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700440class DataIdentityFixture
441{
442public:
443 DataIdentityFixture()
444 : identity("/TestData")
445 {
446 identity.appendVersion();
447
448 BOOST_REQUIRE_NO_THROW(certName = keyChain.createIdentity(identity));
449 }
450
451 ~DataIdentityFixture()
452 {
453 BOOST_CHECK_NO_THROW(keyChain.deleteIdentity(identity));
454 }
455
456public:
457 KeyChain keyChain;
458 Name identity;
459 Name certName;
460};
461
462BOOST_FIXTURE_TEST_CASE(FullName, DataIdentityFixture)
463{
464 // Encoding pipeline
465
466 ndn::Data d(ndn::Name("/local/ndn/prefix"));
Junxiao Shia464b922014-11-12 21:13:06 -0700467 d.setContentType(tlv::ContentType_Blob);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700468 d.setFreshnessPeriod(time::seconds(10));
469
470 d.setContent(Content1, sizeof(Content1));
471
472 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
473
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700474 keyChain.sign(d, security::SigningInfo(security::SigningInfo::SIGNER_TYPE_CERT, certName));
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700475
476 Name fullName;
477 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
478
479 BOOST_CHECK_EQUAL(d.getName().hasWire(), true);
480 BOOST_CHECK_EQUAL(fullName.hasWire(), false);
481
482 // check if name was properly cached
483 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
484
485 // check FullName content
486 BOOST_REQUIRE_EQUAL(d.getName().size() + 1, fullName.size());
487 BOOST_CHECK_EQUAL_COLLECTIONS(d.getName().begin(), d.getName().end(),
488 fullName.begin(), fullName.end() - 1);
489 BOOST_CHECK_EQUAL(fullName.get(-1).value_size(), 32);
490
491 // FullName should be reset after the next line
492 d.setFreshnessPeriod(time::seconds(100));
493 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
494
495 // Decoding pipeline
496 d.wireDecode(Block(Data1, sizeof(Data1)));
497 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
498
499 BOOST_CHECK_EQUAL(fullName.toUri(),
500 "/local/ndn/prefix/"
Alexander Afanasyevafee0a52014-11-07 11:15:34 -0800501 "sha256digest=28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548");
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700502}
503
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800504BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800505
Spyridon Mastorakis429634f2015-02-19 17:35:33 -0800506} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800507} // namespace ndn