blob: 7e523760cdefddf70c03b4831d8cb21095a62958 [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
235 a = SignatureSha256();
236 b = SignatureSha256WithRsa();
237 BOOST_CHECK_EQUAL(a == b, false);
238 BOOST_CHECK_EQUAL(a != b, true);
239
240 b = SignatureSha256();
241 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 Afanasyevff2d08f2014-04-07 18:28:25 -0700353BOOST_AUTO_TEST_CASE(EncodeMetaInfo)
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800354{
355 MetaInfo meta;
356 meta.setType(MetaInfo::TYPE_DEFAULT);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700357 meta.setFreshnessPeriod(time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800358
359 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
360 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo1, MetaInfo1+sizeof(MetaInfo1),
361 meta.wireEncode().begin(), meta.wireEncode().end());
362
363 meta.setFinalBlockId(name::Component("hello,world!"));
364 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
365 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo2, MetaInfo2+sizeof(MetaInfo2),
366 meta.wireEncode().begin(), meta.wireEncode().end());
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700367
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800368 meta.setType(MetaInfo::TYPE_LINK);
369 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
370 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo3, MetaInfo3+sizeof(MetaInfo3),
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700371 meta.wireEncode().begin(), meta.wireEncode().end());
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800372}
373
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700374BOOST_AUTO_TEST_CASE(DecodeMetaInfo)
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800375{
376 MetaInfo meta(Block(MetaInfo1, sizeof(MetaInfo1)));
377 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700378 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800379 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component());
380
381 meta.wireDecode(Block(MetaInfo2, sizeof(MetaInfo2)));
382 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700383 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800384 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component("hello,world!"));
385
386 meta.wireDecode(Block(MetaInfo3, sizeof(MetaInfo3)));
387 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_LINK));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700388 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800389 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component("hello,world!"));
390}
391
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800392BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800393
394} // namespace ndn