blob: ab9cee6fbdca9e1e4047318033c854899736e114 [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] = {};
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700197 Block signatureValue = makeBinaryBlock(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 Afanasyevd5c48e02015-06-24 11:58:14 -0700385 signatureInfo.push_back(makeNonNegativeIntegerBlock(tlv::SignatureType, Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800386 }
387 // KeyLocator
388 {
389 KeyLocator keyLocator;
390 keyLocator.setName("/test/key/locator");
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700391
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800392 signatureInfo.push_back(keyLocator.wireEncode());
393 }
394 signatureInfo.encode();
395
396 // SignatureValue
397 OBufferStream os;
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600398 tlv::writeVarNumber(os, tlv::SignatureValue);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800399
400 using namespace CryptoPP;
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700401
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800402 RSASS<PKCS1v15, SHA256>::Signer signer(privateKey_);
403
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800404 PK_MessageAccumulator *hash = signer.NewSignatureAccumulator(rng_);
405 hash->Update(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
406 hash->Update(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
407 hash->Update(d.getContent(). wire(), d.getContent(). size());
408 hash->Update(signatureInfo. wire(), signatureInfo. size());
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700409
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800410 size_t length = signer.MaxSignatureLength();
411 SecByteBlock buf(length);
412 signer.Sign(rng_, hash, buf);
413
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600414 tlv::writeVarNumber(os, buf.size());
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700415 os.write(reinterpret_cast<const char *>(buf.BytePtr()), buf.size());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800416
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700417 ndn::Block signatureValue(Block(os.buf()));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700418
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800419 Signature signature(signatureInfo, signatureValue);
420
421 d.setSignature(signature);
422
423 Block dataBlock;
424 BOOST_REQUIRE_NO_THROW(dataBlock = d.wireEncode());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800425
426 BOOST_REQUIRE_EQUAL_COLLECTIONS(Data1, Data1+sizeof(Data1),
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800427 dataBlock.begin(), dataBlock.end());
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700428
429 std::ostringstream strStream;
430 BOOST_CHECK_NO_THROW(strStream << d);
431
432 BOOST_CHECK_EQUAL(strStream.str(),
433 "Name: /local/ndn/prefix\n"
434 "MetaInfo: ContentType: 0, FreshnessPeriod: 10000 milliseconds\n"
435 "Content: (size: 8)\n"
436 "Signature: (type: 1, value_length: 128)\n");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800437}
438
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700439class DataIdentityFixture
440{
441public:
442 DataIdentityFixture()
443 : identity("/TestData")
444 {
445 identity.appendVersion();
446
447 BOOST_REQUIRE_NO_THROW(certName = keyChain.createIdentity(identity));
448 }
449
450 ~DataIdentityFixture()
451 {
452 BOOST_CHECK_NO_THROW(keyChain.deleteIdentity(identity));
453 }
454
455public:
456 KeyChain keyChain;
457 Name identity;
458 Name certName;
459};
460
461BOOST_FIXTURE_TEST_CASE(FullName, DataIdentityFixture)
462{
463 // Encoding pipeline
464
465 ndn::Data d(ndn::Name("/local/ndn/prefix"));
Junxiao Shia464b922014-11-12 21:13:06 -0700466 d.setContentType(tlv::ContentType_Blob);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700467 d.setFreshnessPeriod(time::seconds(10));
468
469 d.setContent(Content1, sizeof(Content1));
470
471 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
472
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700473 keyChain.sign(d, security::SigningInfo(security::SigningInfo::SIGNER_TYPE_CERT, certName));
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700474
475 Name fullName;
476 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
477
478 BOOST_CHECK_EQUAL(d.getName().hasWire(), true);
479 BOOST_CHECK_EQUAL(fullName.hasWire(), false);
480
481 // check if name was properly cached
482 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
483
484 // check FullName content
485 BOOST_REQUIRE_EQUAL(d.getName().size() + 1, fullName.size());
486 BOOST_CHECK_EQUAL_COLLECTIONS(d.getName().begin(), d.getName().end(),
487 fullName.begin(), fullName.end() - 1);
488 BOOST_CHECK_EQUAL(fullName.get(-1).value_size(), 32);
489
490 // FullName should be reset after the next line
491 d.setFreshnessPeriod(time::seconds(100));
492 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
493
494 // Decoding pipeline
495 d.wireDecode(Block(Data1, sizeof(Data1)));
496 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
497
498 BOOST_CHECK_EQUAL(fullName.toUri(),
499 "/local/ndn/prefix/"
Alexander Afanasyevafee0a52014-11-07 11:15:34 -0800500 "sha256digest=28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548");
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700501}
502
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800503BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800504
Spyridon Mastorakis429634f2015-02-19 17:35:33 -0800505} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800506} // namespace ndn