blob: e7be94eeeb042ff10dc70e683e571cb619225eea [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/**
Alexander Afanasyevc169a812014-05-20 20:37:29 -04003 * Copyright (c) 2013-2014 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 Afanasyev5fa9e9a2013-12-24 19:45:07 -080029using namespace std;
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -080030namespace ndn {
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080031
32BOOST_AUTO_TEST_SUITE(TestData)
33
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -070034BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Data>));
35BOOST_CONCEPT_ASSERT((boost::EqualityComparable<MetaInfo>));
36BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Signature>));
37
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080038const uint8_t Content1[] = {0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21};
39
40const uint8_t Data1[] = {
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700410x06, 0xc5, // NDN Data
42 0x07, 0x14, // Name
43 0x08, 0x05,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080044 0x6c, 0x6f, 0x63, 0x61, 0x6c,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070045 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080046 0x6e, 0x64, 0x6e,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070047 0x08, 0x06,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080048 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080049 0x14, 0x04, // MetaInfo
50 0x19, 0x02, // FreshnessPeriod
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070051 0x27, 0x10,
52 0x15, 0x08, // Content
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080053 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080054 0x16, 0x1b, // SignatureInfo
55 0x1b, 0x01, // SignatureType
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070056 0x01,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080057 0x1c, 0x16, // KeyLocator
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070058 0x07, 0x14, // Name
59 0x08, 0x04,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080060 0x74, 0x65, 0x73, 0x74,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070061 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080062 0x6b, 0x65, 0x79,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070063 0x08, 0x07,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080064 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080065 0x17, 0x80, // SignatureValue
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070066 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
67 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
68 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
69 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
70 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
71 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
72 0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
73 0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
74 0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
75 0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080076};
77
78const unsigned char DEFAULT_PRIVATE_KEY_DER[] = {
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070079 0x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,
80 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82,
81 0x02, 0x5a, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e, 0x47, 0x85,
82 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47, 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05,
83 0x3a, 0x24, 0x1e, 0xeb, 0x89, 0x01, 0xbb, 0xe9, 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68,
84 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7, 0x06, 0x90, 0x9c, 0xaa,
85 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3, 0x1b, 0x88,
86 0x9a, 0x97, 0x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82,
87 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d, 0x24, 0xc2, 0x63, 0xf3, 0x97, 0x17,
88 0xeb, 0xfe, 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f,
89 0xb8, 0xf2, 0xf1, 0xc5, 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed,
90 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76, 0x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11,
91 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0, 0x2a, 0xe3, 0x6b, 0x0c, 0x8b, 0x73,
92 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c, 0x5b, 0x43, 0x29, 0xad,
93 0x3a, 0x3b, 0x93, 0xa3, 0x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e, 0x33, 0x3f,
94 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44, 0x00, 0xde, 0x72, 0xed,
95 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2,
96 0x69, 0x1f, 0xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13,
97 0x06, 0x69, 0x06, 0xd8, 0x3f, 0x22, 0x15, 0x75, 0xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66,
98 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2, 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37,
99 0x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88, 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f,
100 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02, 0x41, 0x00, 0xb6, 0x2e, 0xbb, 0xcd, 0x2f, 0x3a,
101 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e, 0x64, 0xa7,
102 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae,
103 0xb0, 0x74, 0xa6, 0x99, 0xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e,
104 0x56, 0xad, 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c, 0xb7, 0x9a, 0x3e, 0x99,
105 0xef, 0xb9, 0x02, 0x41, 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1,
106 0xac, 0xee, 0xcb, 0x41, 0x81, 0xc6, 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21,
107 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96, 0x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8,
108 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6, 0x90, 0xb5, 0xce, 0x1b,
109 0x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a, 0x7f, 0x02,
110 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0, 0x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89,
111 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee, 0x51, 0x57,
112 0xd5, 0x97, 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e,
113 0x88, 0x63, 0xe2, 0x66, 0x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a,
114 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca, 0x78, 0xab, 0x21, 0x02, 0x41, 0x00, 0x8f, 0xae,
115 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24, 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81,
116 0xbc, 0x2c, 0x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d, 0x28, 0xd9, 0x10, 0x1a,
117 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14, 0xbf, 0xc9, 0xff, 0x17, 0xd6, 0x47,
118 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
119 0xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a,
120 0x33, 0x2f, 0x4b, 0xa2, 0xbd, 0xd1, 0xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15,
121 0x37, 0x1b, 0xde, 0x76, 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9, 0x4f, 0x35,
122 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95, 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21,
123 0x6d, 0xa0, 0x84, 0x39, 0xe9, 0x2e, 0x1e, 0xfc, 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d,
124 0x0a, 0xb6
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800125};
126
Alexander Afanasyev4b456282014-02-13 00:34:34 -0800127const uint8_t MetaInfo1[] = {0x14, 0x04, 0x19, 0x02, 0x27, 0x10};
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700128const uint8_t MetaInfo2[] = {0x14, 0x14, 0x19, 0x02, 0x27, 0x10, 0x1a, 0x0e, 0x08, 0x0c,
129 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x77, 0x6f, 0x72, 0x6c,
130 0x64, 0x21};
131const uint8_t MetaInfo3[] = {0x14, 0x17, 0x18, 0x01, 0x01, 0x19, 0x02, 0x27, 0x10, 0x1a,
132 0x0e, 0x08, 0x0c, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x77,
133 0x6f, 0x72, 0x6c, 0x64, 0x21};
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800134
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700135BOOST_AUTO_TEST_CASE(DataEqualityChecks)
136{
137 using namespace time;
138
139 Data a;
140 Data b;
141 BOOST_CHECK_EQUAL(a == b, true);
142 BOOST_CHECK_EQUAL(a != b, false);
143
144 a.setName("ndn:/A");
145 BOOST_CHECK_EQUAL(a == b, false);
146 BOOST_CHECK_EQUAL(a != b, true);
147
148 b.setName("ndn:/B");
149 BOOST_CHECK_EQUAL(a == b, false);
150 BOOST_CHECK_EQUAL(a != b, true);
151
152 b.setName("ndn:/A");
153 BOOST_CHECK_EQUAL(a == b, true);
154 BOOST_CHECK_EQUAL(a != b, false);
155
156 a.setFreshnessPeriod(seconds(10));
157 BOOST_CHECK_EQUAL(a == b, false);
158 BOOST_CHECK_EQUAL(a != b, true);
159
160 b.setFreshnessPeriod(seconds(10));
161 BOOST_CHECK_EQUAL(a == b, true);
162 BOOST_CHECK_EQUAL(a != b, false);
163
164 static const uint8_t someData[] = "someData";
165 a.setContent(someData, sizeof(someData));
166 BOOST_CHECK_EQUAL(a == b, false);
167 BOOST_CHECK_EQUAL(a != b, true);
168
169 b.setContent(someData, sizeof(someData));
170 BOOST_CHECK_EQUAL(a == b, true);
171 BOOST_CHECK_EQUAL(a != b, false);
172
173 a.setSignature(SignatureSha256WithRsa());
174 BOOST_CHECK_EQUAL(a == b, false);
175 BOOST_CHECK_EQUAL(a != b, true);
176
177 b.setSignature(SignatureSha256WithRsa());
178 BOOST_CHECK_EQUAL(a == b, true);
179 BOOST_CHECK_EQUAL(a != b, false);
180}
181
182BOOST_AUTO_TEST_CASE(MetaInfoEqualityChecks)
183{
184 using namespace time;
185
186 MetaInfo a;
187 MetaInfo b;
188 BOOST_CHECK_EQUAL(a == b, true);
189 BOOST_CHECK_EQUAL(a != b, false);
190
191 a.setFreshnessPeriod(seconds(10));
192 BOOST_CHECK_EQUAL(a == b, false);
193 BOOST_CHECK_EQUAL(a != b, true);
194
195 b.setFreshnessPeriod(milliseconds(90000));
196 BOOST_CHECK_EQUAL(a == b, false);
197 BOOST_CHECK_EQUAL(a != b, true);
198
199 b.setFreshnessPeriod(milliseconds(10000));
200 BOOST_CHECK_EQUAL(a == b, true);
201 BOOST_CHECK_EQUAL(a != b, false);
202
203 a.setType(10);
204 BOOST_CHECK_EQUAL(a == b, false);
205 BOOST_CHECK_EQUAL(a != b, true);
206
207 b.setType(10);
208 BOOST_CHECK_EQUAL(a == b, true);
209 BOOST_CHECK_EQUAL(a != b, false);
210}
211
212BOOST_AUTO_TEST_CASE(SignatureEqualityChecks)
213{
214 Signature a;
215 Signature b;
216
217 BOOST_CHECK_EQUAL(a == b, true);
218 BOOST_CHECK_EQUAL(a != b, false);
219
220 a = SignatureSha256WithRsa();
221 BOOST_CHECK_EQUAL(a == b, false);
222 BOOST_CHECK_EQUAL(a != b, true);
223
224 b = SignatureSha256WithRsa();
225 static const uint8_t someData[256] = {};
226 Block signatureValue = dataBlock(Tlv::SignatureValue, someData, sizeof(someData));
227 b.setValue(signatureValue);
228 BOOST_CHECK_EQUAL(a == b, false);
229 BOOST_CHECK_EQUAL(a != b, true);
230
231 a.setValue(signatureValue);
232 BOOST_CHECK_EQUAL(a == b, true);
233 BOOST_CHECK_EQUAL(a != b, false);
234
Yingdi Yubf6a2812014-06-17 15:32:11 -0700235 a = DigestSha256();
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700236 b = SignatureSha256WithRsa();
237 BOOST_CHECK_EQUAL(a == b, false);
238 BOOST_CHECK_EQUAL(a != b, true);
239
Yingdi Yubf6a2812014-06-17 15:32:11 -0700240 b = DigestSha256();
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700241 BOOST_CHECK_EQUAL(a == b, true);
242 BOOST_CHECK_EQUAL(a != b, false);
243}
244
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800245class TestDataFixture
246{
247public:
248 TestDataFixture()
249 {
250 CryptoPP::StringSource source(DEFAULT_PRIVATE_KEY_DER, sizeof(DEFAULT_PRIVATE_KEY_DER), true);
251 privateKey_.Load(source);
252 publicKey_ = privateKey_;
253 }
254
255protected:
256 CryptoPP::AutoSeededRandomPool rng_;
257 CryptoPP::RSA::PrivateKey privateKey_;
258 CryptoPP::RSA::PublicKey publicKey_;
259};
260
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700261BOOST_FIXTURE_TEST_CASE(Decode, TestDataFixture)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800262{
263 Block dataBlock(Data1, sizeof(Data1));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700264
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800265 ndn::Data d;
266 // BOOST_REQUIRE_NO_THROW
267 (d.wireDecode(dataBlock));
268
269 BOOST_REQUIRE_EQUAL(d.getName().toUri(), "/local/ndn/prefix");
270 BOOST_REQUIRE_EQUAL(d.getContentType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700271 BOOST_REQUIRE_EQUAL(d.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800272
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700273 BOOST_REQUIRE_EQUAL(std::string(reinterpret_cast<const char*>(d.getContent().value()),
274 d.getContent().value_size()), "SUCCESS!");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800275
Alexander Afanasyev76c51562014-01-03 15:13:48 -0800276 BOOST_REQUIRE_EQUAL(d.getSignature().getType(), static_cast<uint32_t>(Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800277 ndn::Block block = d.getSignature().getInfo();
278 block.parse();
279 KeyLocator keyLocator;
280 BOOST_REQUIRE_NO_THROW(keyLocator.wireDecode(block.get(Tlv::KeyLocator)));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700281
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800282 BOOST_REQUIRE_EQUAL(keyLocator.getName().toUri(), "/test/key/locator");
283
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700284 using namespace CryptoPP;
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800285 RSASS<PKCS1v15, SHA256>::Verifier verifier(publicKey_);
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700286 bool signatureVerified = verifier.VerifyMessage(d.wireEncode().value(),
287 d.wireEncode().value_size() -
288 d.getSignature().getValue().size(),
289 d.getSignature().getValue().value(),
290 d.getSignature().getValue().value_size());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800291 BOOST_REQUIRE_EQUAL(signatureVerified, true);
292}
293
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700294BOOST_FIXTURE_TEST_CASE(Encode, TestDataFixture)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800295{
296 // manual data packet creation for now
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700297
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800298 ndn::Data d(ndn::Name("/local/ndn/prefix"));
299 d.setContentType(MetaInfo::TYPE_DEFAULT);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700300 d.setFreshnessPeriod(time::seconds(10));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700301
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800302 d.setContent(Content1, sizeof(Content1));
303
304 Block signatureInfo(Tlv::SignatureInfo);
305 // SignatureType
306 {
Alexander Afanasyev90df0002014-01-03 15:32:43 -0800307 signatureInfo.push_back
308 (nonNegativeIntegerBlock(Tlv::SignatureType, Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800309 }
310 // KeyLocator
311 {
312 KeyLocator keyLocator;
313 keyLocator.setName("/test/key/locator");
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700314
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800315 signatureInfo.push_back(keyLocator.wireEncode());
316 }
317 signatureInfo.encode();
318
319 // SignatureValue
320 OBufferStream os;
321 Tlv::writeVarNumber(os, Tlv::SignatureValue);
322
323 using namespace CryptoPP;
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700324
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800325 RSASS<PKCS1v15, SHA256>::Signer signer(privateKey_);
326
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800327 PK_MessageAccumulator *hash = signer.NewSignatureAccumulator(rng_);
328 hash->Update(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
329 hash->Update(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
330 hash->Update(d.getContent(). wire(), d.getContent(). size());
331 hash->Update(signatureInfo. wire(), signatureInfo. size());
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700332
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800333 size_t length = signer.MaxSignatureLength();
334 SecByteBlock buf(length);
335 signer.Sign(rng_, hash, buf);
336
337 Tlv::writeVarNumber(os, buf.size());
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700338 os.write(reinterpret_cast<const char *>(buf.BytePtr()), buf.size());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800339
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700340 ndn::Block signatureValue(Block(os.buf()));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700341
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800342 Signature signature(signatureInfo, signatureValue);
343
344 d.setSignature(signature);
345
346 Block dataBlock;
347 BOOST_REQUIRE_NO_THROW(dataBlock = d.wireEncode());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800348
349 BOOST_REQUIRE_EQUAL_COLLECTIONS(Data1, Data1+sizeof(Data1),
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800350 dataBlock.begin(), dataBlock.end());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800351}
352
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700353class DataIdentityFixture
354{
355public:
356 DataIdentityFixture()
357 : identity("/TestData")
358 {
359 identity.appendVersion();
360
361 BOOST_REQUIRE_NO_THROW(certName = keyChain.createIdentity(identity));
362 }
363
364 ~DataIdentityFixture()
365 {
366 BOOST_CHECK_NO_THROW(keyChain.deleteIdentity(identity));
367 }
368
369public:
370 KeyChain keyChain;
371 Name identity;
372 Name certName;
373};
374
375BOOST_FIXTURE_TEST_CASE(FullName, DataIdentityFixture)
376{
377 // Encoding pipeline
378
379 ndn::Data d(ndn::Name("/local/ndn/prefix"));
380 d.setContentType(MetaInfo::TYPE_DEFAULT);
381 d.setFreshnessPeriod(time::seconds(10));
382
383 d.setContent(Content1, sizeof(Content1));
384
385 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
386
387 keyChain.sign(d, certName);
388
389 Name fullName;
390 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
391
392 BOOST_CHECK_EQUAL(d.getName().hasWire(), true);
393 BOOST_CHECK_EQUAL(fullName.hasWire(), false);
394
395 // check if name was properly cached
396 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
397
398 // check FullName content
399 BOOST_REQUIRE_EQUAL(d.getName().size() + 1, fullName.size());
400 BOOST_CHECK_EQUAL_COLLECTIONS(d.getName().begin(), d.getName().end(),
401 fullName.begin(), fullName.end() - 1);
402 BOOST_CHECK_EQUAL(fullName.get(-1).value_size(), 32);
403
404 // FullName should be reset after the next line
405 d.setFreshnessPeriod(time::seconds(100));
406 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
407
408 // Decoding pipeline
409 d.wireDecode(Block(Data1, sizeof(Data1)));
410 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
411
412 BOOST_CHECK_EQUAL(fullName.toUri(),
413 "/local/ndn/prefix/"
414 "%28%BA%D4%B5%27%5B%D3%92%DB%B6p%C7%5C%F0%B6o%13%F7%94+%21%E8%0FU%C0%E8k7GS%A5H");
415}
416
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700417BOOST_AUTO_TEST_CASE(EncodeMetaInfo)
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800418{
419 MetaInfo meta;
420 meta.setType(MetaInfo::TYPE_DEFAULT);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700421 meta.setFreshnessPeriod(time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800422
423 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
424 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo1, MetaInfo1+sizeof(MetaInfo1),
425 meta.wireEncode().begin(), meta.wireEncode().end());
426
427 meta.setFinalBlockId(name::Component("hello,world!"));
428 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
429 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo2, MetaInfo2+sizeof(MetaInfo2),
430 meta.wireEncode().begin(), meta.wireEncode().end());
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700431
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800432 meta.setType(MetaInfo::TYPE_LINK);
433 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
434 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo3, MetaInfo3+sizeof(MetaInfo3),
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700435 meta.wireEncode().begin(), meta.wireEncode().end());
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800436}
437
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700438BOOST_AUTO_TEST_CASE(DecodeMetaInfo)
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800439{
440 MetaInfo meta(Block(MetaInfo1, sizeof(MetaInfo1)));
441 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700442 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800443 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component());
444
445 meta.wireDecode(Block(MetaInfo2, sizeof(MetaInfo2)));
446 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700447 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800448 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component("hello,world!"));
449
450 meta.wireDecode(Block(MetaInfo3, sizeof(MetaInfo3)));
451 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_LINK));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700452 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800453 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component("hello,world!"));
454}
455
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800456BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800457
458} // namespace ndn