blob: 5ce434e46cc52a29aa627b18c6657268ce36fd80 [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 Afanasyeva0c5f832014-06-19 13:27:56 -0700351
352 std::ostringstream strStream;
353 BOOST_CHECK_NO_THROW(strStream << d);
354
355 BOOST_CHECK_EQUAL(strStream.str(),
356 "Name: /local/ndn/prefix\n"
357 "MetaInfo: ContentType: 0, FreshnessPeriod: 10000 milliseconds\n"
358 "Content: (size: 8)\n"
359 "Signature: (type: 1, value_length: 128)\n");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800360}
361
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700362class DataIdentityFixture
363{
364public:
365 DataIdentityFixture()
366 : identity("/TestData")
367 {
368 identity.appendVersion();
369
370 BOOST_REQUIRE_NO_THROW(certName = keyChain.createIdentity(identity));
371 }
372
373 ~DataIdentityFixture()
374 {
375 BOOST_CHECK_NO_THROW(keyChain.deleteIdentity(identity));
376 }
377
378public:
379 KeyChain keyChain;
380 Name identity;
381 Name certName;
382};
383
384BOOST_FIXTURE_TEST_CASE(FullName, DataIdentityFixture)
385{
386 // Encoding pipeline
387
388 ndn::Data d(ndn::Name("/local/ndn/prefix"));
389 d.setContentType(MetaInfo::TYPE_DEFAULT);
390 d.setFreshnessPeriod(time::seconds(10));
391
392 d.setContent(Content1, sizeof(Content1));
393
394 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
395
396 keyChain.sign(d, certName);
397
398 Name fullName;
399 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
400
401 BOOST_CHECK_EQUAL(d.getName().hasWire(), true);
402 BOOST_CHECK_EQUAL(fullName.hasWire(), false);
403
404 // check if name was properly cached
405 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
406
407 // check FullName content
408 BOOST_REQUIRE_EQUAL(d.getName().size() + 1, fullName.size());
409 BOOST_CHECK_EQUAL_COLLECTIONS(d.getName().begin(), d.getName().end(),
410 fullName.begin(), fullName.end() - 1);
411 BOOST_CHECK_EQUAL(fullName.get(-1).value_size(), 32);
412
413 // FullName should be reset after the next line
414 d.setFreshnessPeriod(time::seconds(100));
415 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
416
417 // Decoding pipeline
418 d.wireDecode(Block(Data1, sizeof(Data1)));
419 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
420
421 BOOST_CHECK_EQUAL(fullName.toUri(),
422 "/local/ndn/prefix/"
423 "%28%BA%D4%B5%27%5B%D3%92%DB%B6p%C7%5C%F0%B6o%13%F7%94+%21%E8%0FU%C0%E8k7GS%A5H");
424}
425
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700426BOOST_AUTO_TEST_CASE(EncodeMetaInfo)
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800427{
428 MetaInfo meta;
429 meta.setType(MetaInfo::TYPE_DEFAULT);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700430 meta.setFreshnessPeriod(time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800431
432 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
433 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo1, MetaInfo1+sizeof(MetaInfo1),
434 meta.wireEncode().begin(), meta.wireEncode().end());
435
436 meta.setFinalBlockId(name::Component("hello,world!"));
437 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
438 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo2, MetaInfo2+sizeof(MetaInfo2),
439 meta.wireEncode().begin(), meta.wireEncode().end());
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700440
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800441 meta.setType(MetaInfo::TYPE_LINK);
442 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
443 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo3, MetaInfo3+sizeof(MetaInfo3),
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700444 meta.wireEncode().begin(), meta.wireEncode().end());
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800445}
446
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700447BOOST_AUTO_TEST_CASE(DecodeMetaInfo)
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800448{
449 MetaInfo meta(Block(MetaInfo1, sizeof(MetaInfo1)));
450 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700451 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800452 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component());
453
454 meta.wireDecode(Block(MetaInfo2, sizeof(MetaInfo2)));
455 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700456 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800457 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component("hello,world!"));
458
459 meta.wireDecode(Block(MetaInfo3, sizeof(MetaInfo3)));
460 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_LINK));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700461 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800462 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component("hello,world!"));
463}
464
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800465BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800466
467} // namespace ndn