blob: 2e022a12c71bb9369180879b595dd3e649b13c5e [file] [log] [blame]
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -08002/**
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07003 * Copyright (c) 2013-2014, Regents of the University of California.
4 * All rights reserved.
5 *
6 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
7 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
8 *
9 * This file licensed under New BSD License. See COPYING for detailed information about
10 * ndn-cxx library copyright, permissions, and redistribution restrictions.
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080011 */
12
Alexander Afanasyev09c613f2014-01-29 00:23:58 -080013#include "data.hpp"
14#include "security/key-chain.hpp"
Junxiao Shi482ccc52014-03-31 13:05:24 -070015#include "security/cryptopp.hpp"
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080016
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070017#include "boost-test.hpp"
18
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080019using namespace std;
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -080020namespace ndn {
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080021
22BOOST_AUTO_TEST_SUITE(TestData)
23
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -070024BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Data>));
25BOOST_CONCEPT_ASSERT((boost::EqualityComparable<MetaInfo>));
26BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Signature>));
27
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080028const uint8_t Content1[] = {0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21};
29
30const uint8_t Data1[] = {
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700310x06, 0xc5, // NDN Data
32 0x07, 0x14, // Name
33 0x08, 0x05,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080034 0x6c, 0x6f, 0x63, 0x61, 0x6c,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070035 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080036 0x6e, 0x64, 0x6e,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070037 0x08, 0x06,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080038 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080039 0x14, 0x04, // MetaInfo
40 0x19, 0x02, // FreshnessPeriod
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070041 0x27, 0x10,
42 0x15, 0x08, // Content
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080043 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080044 0x16, 0x1b, // SignatureInfo
45 0x1b, 0x01, // SignatureType
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070046 0x01,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080047 0x1c, 0x16, // KeyLocator
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070048 0x07, 0x14, // Name
49 0x08, 0x04,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080050 0x74, 0x65, 0x73, 0x74,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070051 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080052 0x6b, 0x65, 0x79,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070053 0x08, 0x07,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080054 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080055 0x17, 0x80, // SignatureValue
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070056 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
57 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
58 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
59 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
60 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
61 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
62 0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
63 0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
64 0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
65 0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080066};
67
68const unsigned char DEFAULT_PRIVATE_KEY_DER[] = {
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070069 0x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,
70 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82,
71 0x02, 0x5a, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e, 0x47, 0x85,
72 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47, 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05,
73 0x3a, 0x24, 0x1e, 0xeb, 0x89, 0x01, 0xbb, 0xe9, 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68,
74 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7, 0x06, 0x90, 0x9c, 0xaa,
75 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3, 0x1b, 0x88,
76 0x9a, 0x97, 0x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82,
77 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d, 0x24, 0xc2, 0x63, 0xf3, 0x97, 0x17,
78 0xeb, 0xfe, 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f,
79 0xb8, 0xf2, 0xf1, 0xc5, 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed,
80 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76, 0x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11,
81 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0, 0x2a, 0xe3, 0x6b, 0x0c, 0x8b, 0x73,
82 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c, 0x5b, 0x43, 0x29, 0xad,
83 0x3a, 0x3b, 0x93, 0xa3, 0x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e, 0x33, 0x3f,
84 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44, 0x00, 0xde, 0x72, 0xed,
85 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2,
86 0x69, 0x1f, 0xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13,
87 0x06, 0x69, 0x06, 0xd8, 0x3f, 0x22, 0x15, 0x75, 0xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66,
88 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2, 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37,
89 0x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88, 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f,
90 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02, 0x41, 0x00, 0xb6, 0x2e, 0xbb, 0xcd, 0x2f, 0x3a,
91 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e, 0x64, 0xa7,
92 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae,
93 0xb0, 0x74, 0xa6, 0x99, 0xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e,
94 0x56, 0xad, 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c, 0xb7, 0x9a, 0x3e, 0x99,
95 0xef, 0xb9, 0x02, 0x41, 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1,
96 0xac, 0xee, 0xcb, 0x41, 0x81, 0xc6, 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21,
97 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96, 0x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8,
98 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6, 0x90, 0xb5, 0xce, 0x1b,
99 0x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a, 0x7f, 0x02,
100 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0, 0x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89,
101 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee, 0x51, 0x57,
102 0xd5, 0x97, 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e,
103 0x88, 0x63, 0xe2, 0x66, 0x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a,
104 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca, 0x78, 0xab, 0x21, 0x02, 0x41, 0x00, 0x8f, 0xae,
105 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24, 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81,
106 0xbc, 0x2c, 0x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d, 0x28, 0xd9, 0x10, 0x1a,
107 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14, 0xbf, 0xc9, 0xff, 0x17, 0xd6, 0x47,
108 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
109 0xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a,
110 0x33, 0x2f, 0x4b, 0xa2, 0xbd, 0xd1, 0xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15,
111 0x37, 0x1b, 0xde, 0x76, 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9, 0x4f, 0x35,
112 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95, 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21,
113 0x6d, 0xa0, 0x84, 0x39, 0xe9, 0x2e, 0x1e, 0xfc, 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d,
114 0x0a, 0xb6
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800115};
116
Alexander Afanasyev4b456282014-02-13 00:34:34 -0800117const uint8_t MetaInfo1[] = {0x14, 0x04, 0x19, 0x02, 0x27, 0x10};
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700118const uint8_t MetaInfo2[] = {0x14, 0x14, 0x19, 0x02, 0x27, 0x10, 0x1a, 0x0e, 0x08, 0x0c,
119 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x77, 0x6f, 0x72, 0x6c,
120 0x64, 0x21};
121const uint8_t MetaInfo3[] = {0x14, 0x17, 0x18, 0x01, 0x01, 0x19, 0x02, 0x27, 0x10, 0x1a,
122 0x0e, 0x08, 0x0c, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x77,
123 0x6f, 0x72, 0x6c, 0x64, 0x21};
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800124
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700125BOOST_AUTO_TEST_CASE(DataEqualityChecks)
126{
127 using namespace time;
128
129 Data a;
130 Data b;
131 BOOST_CHECK_EQUAL(a == b, true);
132 BOOST_CHECK_EQUAL(a != b, false);
133
134 a.setName("ndn:/A");
135 BOOST_CHECK_EQUAL(a == b, false);
136 BOOST_CHECK_EQUAL(a != b, true);
137
138 b.setName("ndn:/B");
139 BOOST_CHECK_EQUAL(a == b, false);
140 BOOST_CHECK_EQUAL(a != b, true);
141
142 b.setName("ndn:/A");
143 BOOST_CHECK_EQUAL(a == b, true);
144 BOOST_CHECK_EQUAL(a != b, false);
145
146 a.setFreshnessPeriod(seconds(10));
147 BOOST_CHECK_EQUAL(a == b, false);
148 BOOST_CHECK_EQUAL(a != b, true);
149
150 b.setFreshnessPeriod(seconds(10));
151 BOOST_CHECK_EQUAL(a == b, true);
152 BOOST_CHECK_EQUAL(a != b, false);
153
154 static const uint8_t someData[] = "someData";
155 a.setContent(someData, sizeof(someData));
156 BOOST_CHECK_EQUAL(a == b, false);
157 BOOST_CHECK_EQUAL(a != b, true);
158
159 b.setContent(someData, sizeof(someData));
160 BOOST_CHECK_EQUAL(a == b, true);
161 BOOST_CHECK_EQUAL(a != b, false);
162
163 a.setSignature(SignatureSha256WithRsa());
164 BOOST_CHECK_EQUAL(a == b, false);
165 BOOST_CHECK_EQUAL(a != b, true);
166
167 b.setSignature(SignatureSha256WithRsa());
168 BOOST_CHECK_EQUAL(a == b, true);
169 BOOST_CHECK_EQUAL(a != b, false);
170}
171
172BOOST_AUTO_TEST_CASE(MetaInfoEqualityChecks)
173{
174 using namespace time;
175
176 MetaInfo a;
177 MetaInfo b;
178 BOOST_CHECK_EQUAL(a == b, true);
179 BOOST_CHECK_EQUAL(a != b, false);
180
181 a.setFreshnessPeriod(seconds(10));
182 BOOST_CHECK_EQUAL(a == b, false);
183 BOOST_CHECK_EQUAL(a != b, true);
184
185 b.setFreshnessPeriod(milliseconds(90000));
186 BOOST_CHECK_EQUAL(a == b, false);
187 BOOST_CHECK_EQUAL(a != b, true);
188
189 b.setFreshnessPeriod(milliseconds(10000));
190 BOOST_CHECK_EQUAL(a == b, true);
191 BOOST_CHECK_EQUAL(a != b, false);
192
193 a.setType(10);
194 BOOST_CHECK_EQUAL(a == b, false);
195 BOOST_CHECK_EQUAL(a != b, true);
196
197 b.setType(10);
198 BOOST_CHECK_EQUAL(a == b, true);
199 BOOST_CHECK_EQUAL(a != b, false);
200}
201
202BOOST_AUTO_TEST_CASE(SignatureEqualityChecks)
203{
204 Signature a;
205 Signature b;
206
207 BOOST_CHECK_EQUAL(a == b, true);
208 BOOST_CHECK_EQUAL(a != b, false);
209
210 a = SignatureSha256WithRsa();
211 BOOST_CHECK_EQUAL(a == b, false);
212 BOOST_CHECK_EQUAL(a != b, true);
213
214 b = SignatureSha256WithRsa();
215 static const uint8_t someData[256] = {};
216 Block signatureValue = dataBlock(Tlv::SignatureValue, someData, sizeof(someData));
217 b.setValue(signatureValue);
218 BOOST_CHECK_EQUAL(a == b, false);
219 BOOST_CHECK_EQUAL(a != b, true);
220
221 a.setValue(signatureValue);
222 BOOST_CHECK_EQUAL(a == b, true);
223 BOOST_CHECK_EQUAL(a != b, false);
224
225 a = SignatureSha256();
226 b = SignatureSha256WithRsa();
227 BOOST_CHECK_EQUAL(a == b, false);
228 BOOST_CHECK_EQUAL(a != b, true);
229
230 b = SignatureSha256();
231 BOOST_CHECK_EQUAL(a == b, true);
232 BOOST_CHECK_EQUAL(a != b, false);
233}
234
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800235class TestDataFixture
236{
237public:
238 TestDataFixture()
239 {
240 CryptoPP::StringSource source(DEFAULT_PRIVATE_KEY_DER, sizeof(DEFAULT_PRIVATE_KEY_DER), true);
241 privateKey_.Load(source);
242 publicKey_ = privateKey_;
243 }
244
245protected:
246 CryptoPP::AutoSeededRandomPool rng_;
247 CryptoPP::RSA::PrivateKey privateKey_;
248 CryptoPP::RSA::PublicKey publicKey_;
249};
250
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700251BOOST_FIXTURE_TEST_CASE(Decode, TestDataFixture)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800252{
253 Block dataBlock(Data1, sizeof(Data1));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700254
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800255 ndn::Data d;
256 // BOOST_REQUIRE_NO_THROW
257 (d.wireDecode(dataBlock));
258
259 BOOST_REQUIRE_EQUAL(d.getName().toUri(), "/local/ndn/prefix");
260 BOOST_REQUIRE_EQUAL(d.getContentType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700261 BOOST_REQUIRE_EQUAL(d.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800262
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700263 BOOST_REQUIRE_EQUAL(std::string(reinterpret_cast<const char*>(d.getContent().value()),
264 d.getContent().value_size()), "SUCCESS!");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800265
Alexander Afanasyev76c51562014-01-03 15:13:48 -0800266 BOOST_REQUIRE_EQUAL(d.getSignature().getType(), static_cast<uint32_t>(Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800267 ndn::Block block = d.getSignature().getInfo();
268 block.parse();
269 KeyLocator keyLocator;
270 BOOST_REQUIRE_NO_THROW(keyLocator.wireDecode(block.get(Tlv::KeyLocator)));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700271
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800272 BOOST_REQUIRE_EQUAL(keyLocator.getName().toUri(), "/test/key/locator");
273
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700274 using namespace CryptoPP;
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800275 RSASS<PKCS1v15, SHA256>::Verifier verifier(publicKey_);
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700276 bool signatureVerified = verifier.VerifyMessage(d.wireEncode().value(),
277 d.wireEncode().value_size() -
278 d.getSignature().getValue().size(),
279 d.getSignature().getValue().value(),
280 d.getSignature().getValue().value_size());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800281 BOOST_REQUIRE_EQUAL(signatureVerified, true);
282}
283
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700284BOOST_FIXTURE_TEST_CASE(Encode, TestDataFixture)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800285{
286 // manual data packet creation for now
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700287
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800288 ndn::Data d(ndn::Name("/local/ndn/prefix"));
289 d.setContentType(MetaInfo::TYPE_DEFAULT);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700290 d.setFreshnessPeriod(time::seconds(10));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700291
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800292 d.setContent(Content1, sizeof(Content1));
293
294 Block signatureInfo(Tlv::SignatureInfo);
295 // SignatureType
296 {
Alexander Afanasyev90df0002014-01-03 15:32:43 -0800297 signatureInfo.push_back
298 (nonNegativeIntegerBlock(Tlv::SignatureType, Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800299 }
300 // KeyLocator
301 {
302 KeyLocator keyLocator;
303 keyLocator.setName("/test/key/locator");
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700304
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800305 signatureInfo.push_back(keyLocator.wireEncode());
306 }
307 signatureInfo.encode();
308
309 // SignatureValue
310 OBufferStream os;
311 Tlv::writeVarNumber(os, Tlv::SignatureValue);
312
313 using namespace CryptoPP;
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700314
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800315 RSASS<PKCS1v15, SHA256>::Signer signer(privateKey_);
316
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800317 PK_MessageAccumulator *hash = signer.NewSignatureAccumulator(rng_);
318 hash->Update(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
319 hash->Update(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
320 hash->Update(d.getContent(). wire(), d.getContent(). size());
321 hash->Update(signatureInfo. wire(), signatureInfo. size());
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700322
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800323 size_t length = signer.MaxSignatureLength();
324 SecByteBlock buf(length);
325 signer.Sign(rng_, hash, buf);
326
327 Tlv::writeVarNumber(os, buf.size());
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700328 os.write(reinterpret_cast<const char *>(buf.BytePtr()), buf.size());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800329
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700330 ndn::Block signatureValue(Block(os.buf()));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700331
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800332 Signature signature(signatureInfo, signatureValue);
333
334 d.setSignature(signature);
335
336 Block dataBlock;
337 BOOST_REQUIRE_NO_THROW(dataBlock = d.wireEncode());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800338
339 BOOST_REQUIRE_EQUAL_COLLECTIONS(Data1, Data1+sizeof(Data1),
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800340 dataBlock.begin(), dataBlock.end());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800341}
342
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700343BOOST_AUTO_TEST_CASE(EncodeMetaInfo)
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800344{
345 MetaInfo meta;
346 meta.setType(MetaInfo::TYPE_DEFAULT);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700347 meta.setFreshnessPeriod(time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800348
349 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
350 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo1, MetaInfo1+sizeof(MetaInfo1),
351 meta.wireEncode().begin(), meta.wireEncode().end());
352
353 meta.setFinalBlockId(name::Component("hello,world!"));
354 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
355 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo2, MetaInfo2+sizeof(MetaInfo2),
356 meta.wireEncode().begin(), meta.wireEncode().end());
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700357
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800358 meta.setType(MetaInfo::TYPE_LINK);
359 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
360 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo3, MetaInfo3+sizeof(MetaInfo3),
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700361 meta.wireEncode().begin(), meta.wireEncode().end());
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800362}
363
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700364BOOST_AUTO_TEST_CASE(DecodeMetaInfo)
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800365{
366 MetaInfo meta(Block(MetaInfo1, sizeof(MetaInfo1)));
367 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700368 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800369 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component());
370
371 meta.wireDecode(Block(MetaInfo2, sizeof(MetaInfo2)));
372 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700373 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800374 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component("hello,world!"));
375
376 meta.wireDecode(Block(MetaInfo3, sizeof(MetaInfo3)));
377 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_LINK));
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("hello,world!"));
380}
381
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800382BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800383
384} // namespace ndn