blob: bfb2cd43284619019b476490358559ce7dfbd121 [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 Afanasyev258ec2b2014-05-14 16:15:37 -070016#include "encoding/buffer-stream.hpp"
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080017
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070018#include "boost-test.hpp"
19
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080020using namespace std;
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -080021namespace ndn {
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080022
23BOOST_AUTO_TEST_SUITE(TestData)
24
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -070025BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Data>));
26BOOST_CONCEPT_ASSERT((boost::EqualityComparable<MetaInfo>));
27BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Signature>));
28
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080029const uint8_t Content1[] = {0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21};
30
31const uint8_t Data1[] = {
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700320x06, 0xc5, // NDN Data
33 0x07, 0x14, // Name
34 0x08, 0x05,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080035 0x6c, 0x6f, 0x63, 0x61, 0x6c,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070036 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080037 0x6e, 0x64, 0x6e,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070038 0x08, 0x06,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080039 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080040 0x14, 0x04, // MetaInfo
41 0x19, 0x02, // FreshnessPeriod
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070042 0x27, 0x10,
43 0x15, 0x08, // Content
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080044 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080045 0x16, 0x1b, // SignatureInfo
46 0x1b, 0x01, // SignatureType
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070047 0x01,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080048 0x1c, 0x16, // KeyLocator
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070049 0x07, 0x14, // Name
50 0x08, 0x04,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080051 0x74, 0x65, 0x73, 0x74,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070052 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080053 0x6b, 0x65, 0x79,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070054 0x08, 0x07,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080055 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080056 0x17, 0x80, // SignatureValue
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070057 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
58 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
59 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
60 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
61 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
62 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
63 0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
64 0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
65 0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
66 0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080067};
68
69const unsigned char DEFAULT_PRIVATE_KEY_DER[] = {
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070070 0x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,
71 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82,
72 0x02, 0x5a, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e, 0x47, 0x85,
73 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47, 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05,
74 0x3a, 0x24, 0x1e, 0xeb, 0x89, 0x01, 0xbb, 0xe9, 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68,
75 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7, 0x06, 0x90, 0x9c, 0xaa,
76 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3, 0x1b, 0x88,
77 0x9a, 0x97, 0x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82,
78 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d, 0x24, 0xc2, 0x63, 0xf3, 0x97, 0x17,
79 0xeb, 0xfe, 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f,
80 0xb8, 0xf2, 0xf1, 0xc5, 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed,
81 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76, 0x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11,
82 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0, 0x2a, 0xe3, 0x6b, 0x0c, 0x8b, 0x73,
83 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c, 0x5b, 0x43, 0x29, 0xad,
84 0x3a, 0x3b, 0x93, 0xa3, 0x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e, 0x33, 0x3f,
85 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44, 0x00, 0xde, 0x72, 0xed,
86 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2,
87 0x69, 0x1f, 0xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13,
88 0x06, 0x69, 0x06, 0xd8, 0x3f, 0x22, 0x15, 0x75, 0xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66,
89 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2, 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37,
90 0x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88, 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f,
91 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02, 0x41, 0x00, 0xb6, 0x2e, 0xbb, 0xcd, 0x2f, 0x3a,
92 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e, 0x64, 0xa7,
93 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae,
94 0xb0, 0x74, 0xa6, 0x99, 0xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e,
95 0x56, 0xad, 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c, 0xb7, 0x9a, 0x3e, 0x99,
96 0xef, 0xb9, 0x02, 0x41, 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1,
97 0xac, 0xee, 0xcb, 0x41, 0x81, 0xc6, 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21,
98 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96, 0x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8,
99 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6, 0x90, 0xb5, 0xce, 0x1b,
100 0x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a, 0x7f, 0x02,
101 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0, 0x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89,
102 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee, 0x51, 0x57,
103 0xd5, 0x97, 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e,
104 0x88, 0x63, 0xe2, 0x66, 0x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a,
105 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca, 0x78, 0xab, 0x21, 0x02, 0x41, 0x00, 0x8f, 0xae,
106 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24, 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81,
107 0xbc, 0x2c, 0x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d, 0x28, 0xd9, 0x10, 0x1a,
108 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14, 0xbf, 0xc9, 0xff, 0x17, 0xd6, 0x47,
109 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
110 0xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a,
111 0x33, 0x2f, 0x4b, 0xa2, 0xbd, 0xd1, 0xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15,
112 0x37, 0x1b, 0xde, 0x76, 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9, 0x4f, 0x35,
113 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95, 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21,
114 0x6d, 0xa0, 0x84, 0x39, 0xe9, 0x2e, 0x1e, 0xfc, 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d,
115 0x0a, 0xb6
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800116};
117
Alexander Afanasyev4b456282014-02-13 00:34:34 -0800118const uint8_t MetaInfo1[] = {0x14, 0x04, 0x19, 0x02, 0x27, 0x10};
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700119const uint8_t MetaInfo2[] = {0x14, 0x14, 0x19, 0x02, 0x27, 0x10, 0x1a, 0x0e, 0x08, 0x0c,
120 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x77, 0x6f, 0x72, 0x6c,
121 0x64, 0x21};
122const uint8_t MetaInfo3[] = {0x14, 0x17, 0x18, 0x01, 0x01, 0x19, 0x02, 0x27, 0x10, 0x1a,
123 0x0e, 0x08, 0x0c, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x77,
124 0x6f, 0x72, 0x6c, 0x64, 0x21};
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800125
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700126BOOST_AUTO_TEST_CASE(DataEqualityChecks)
127{
128 using namespace time;
129
130 Data a;
131 Data b;
132 BOOST_CHECK_EQUAL(a == b, true);
133 BOOST_CHECK_EQUAL(a != b, false);
134
135 a.setName("ndn:/A");
136 BOOST_CHECK_EQUAL(a == b, false);
137 BOOST_CHECK_EQUAL(a != b, true);
138
139 b.setName("ndn:/B");
140 BOOST_CHECK_EQUAL(a == b, false);
141 BOOST_CHECK_EQUAL(a != b, true);
142
143 b.setName("ndn:/A");
144 BOOST_CHECK_EQUAL(a == b, true);
145 BOOST_CHECK_EQUAL(a != b, false);
146
147 a.setFreshnessPeriod(seconds(10));
148 BOOST_CHECK_EQUAL(a == b, false);
149 BOOST_CHECK_EQUAL(a != b, true);
150
151 b.setFreshnessPeriod(seconds(10));
152 BOOST_CHECK_EQUAL(a == b, true);
153 BOOST_CHECK_EQUAL(a != b, false);
154
155 static const uint8_t someData[] = "someData";
156 a.setContent(someData, sizeof(someData));
157 BOOST_CHECK_EQUAL(a == b, false);
158 BOOST_CHECK_EQUAL(a != b, true);
159
160 b.setContent(someData, sizeof(someData));
161 BOOST_CHECK_EQUAL(a == b, true);
162 BOOST_CHECK_EQUAL(a != b, false);
163
164 a.setSignature(SignatureSha256WithRsa());
165 BOOST_CHECK_EQUAL(a == b, false);
166 BOOST_CHECK_EQUAL(a != b, true);
167
168 b.setSignature(SignatureSha256WithRsa());
169 BOOST_CHECK_EQUAL(a == b, true);
170 BOOST_CHECK_EQUAL(a != b, false);
171}
172
173BOOST_AUTO_TEST_CASE(MetaInfoEqualityChecks)
174{
175 using namespace time;
176
177 MetaInfo a;
178 MetaInfo b;
179 BOOST_CHECK_EQUAL(a == b, true);
180 BOOST_CHECK_EQUAL(a != b, false);
181
182 a.setFreshnessPeriod(seconds(10));
183 BOOST_CHECK_EQUAL(a == b, false);
184 BOOST_CHECK_EQUAL(a != b, true);
185
186 b.setFreshnessPeriod(milliseconds(90000));
187 BOOST_CHECK_EQUAL(a == b, false);
188 BOOST_CHECK_EQUAL(a != b, true);
189
190 b.setFreshnessPeriod(milliseconds(10000));
191 BOOST_CHECK_EQUAL(a == b, true);
192 BOOST_CHECK_EQUAL(a != b, false);
193
194 a.setType(10);
195 BOOST_CHECK_EQUAL(a == b, false);
196 BOOST_CHECK_EQUAL(a != b, true);
197
198 b.setType(10);
199 BOOST_CHECK_EQUAL(a == b, true);
200 BOOST_CHECK_EQUAL(a != b, false);
201}
202
203BOOST_AUTO_TEST_CASE(SignatureEqualityChecks)
204{
205 Signature a;
206 Signature b;
207
208 BOOST_CHECK_EQUAL(a == b, true);
209 BOOST_CHECK_EQUAL(a != b, false);
210
211 a = SignatureSha256WithRsa();
212 BOOST_CHECK_EQUAL(a == b, false);
213 BOOST_CHECK_EQUAL(a != b, true);
214
215 b = SignatureSha256WithRsa();
216 static const uint8_t someData[256] = {};
217 Block signatureValue = dataBlock(Tlv::SignatureValue, someData, sizeof(someData));
218 b.setValue(signatureValue);
219 BOOST_CHECK_EQUAL(a == b, false);
220 BOOST_CHECK_EQUAL(a != b, true);
221
222 a.setValue(signatureValue);
223 BOOST_CHECK_EQUAL(a == b, true);
224 BOOST_CHECK_EQUAL(a != b, false);
225
226 a = SignatureSha256();
227 b = SignatureSha256WithRsa();
228 BOOST_CHECK_EQUAL(a == b, false);
229 BOOST_CHECK_EQUAL(a != b, true);
230
231 b = SignatureSha256();
232 BOOST_CHECK_EQUAL(a == b, true);
233 BOOST_CHECK_EQUAL(a != b, false);
234}
235
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800236class TestDataFixture
237{
238public:
239 TestDataFixture()
240 {
241 CryptoPP::StringSource source(DEFAULT_PRIVATE_KEY_DER, sizeof(DEFAULT_PRIVATE_KEY_DER), true);
242 privateKey_.Load(source);
243 publicKey_ = privateKey_;
244 }
245
246protected:
247 CryptoPP::AutoSeededRandomPool rng_;
248 CryptoPP::RSA::PrivateKey privateKey_;
249 CryptoPP::RSA::PublicKey publicKey_;
250};
251
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700252BOOST_FIXTURE_TEST_CASE(Decode, TestDataFixture)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800253{
254 Block dataBlock(Data1, sizeof(Data1));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700255
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800256 ndn::Data d;
257 // BOOST_REQUIRE_NO_THROW
258 (d.wireDecode(dataBlock));
259
260 BOOST_REQUIRE_EQUAL(d.getName().toUri(), "/local/ndn/prefix");
261 BOOST_REQUIRE_EQUAL(d.getContentType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700262 BOOST_REQUIRE_EQUAL(d.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800263
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700264 BOOST_REQUIRE_EQUAL(std::string(reinterpret_cast<const char*>(d.getContent().value()),
265 d.getContent().value_size()), "SUCCESS!");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800266
Alexander Afanasyev76c51562014-01-03 15:13:48 -0800267 BOOST_REQUIRE_EQUAL(d.getSignature().getType(), static_cast<uint32_t>(Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800268 ndn::Block block = d.getSignature().getInfo();
269 block.parse();
270 KeyLocator keyLocator;
271 BOOST_REQUIRE_NO_THROW(keyLocator.wireDecode(block.get(Tlv::KeyLocator)));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700272
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800273 BOOST_REQUIRE_EQUAL(keyLocator.getName().toUri(), "/test/key/locator");
274
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700275 using namespace CryptoPP;
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800276 RSASS<PKCS1v15, SHA256>::Verifier verifier(publicKey_);
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700277 bool signatureVerified = verifier.VerifyMessage(d.wireEncode().value(),
278 d.wireEncode().value_size() -
279 d.getSignature().getValue().size(),
280 d.getSignature().getValue().value(),
281 d.getSignature().getValue().value_size());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800282 BOOST_REQUIRE_EQUAL(signatureVerified, true);
283}
284
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700285BOOST_FIXTURE_TEST_CASE(Encode, TestDataFixture)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800286{
287 // manual data packet creation for now
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700288
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800289 ndn::Data d(ndn::Name("/local/ndn/prefix"));
290 d.setContentType(MetaInfo::TYPE_DEFAULT);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700291 d.setFreshnessPeriod(time::seconds(10));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700292
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800293 d.setContent(Content1, sizeof(Content1));
294
295 Block signatureInfo(Tlv::SignatureInfo);
296 // SignatureType
297 {
Alexander Afanasyev90df0002014-01-03 15:32:43 -0800298 signatureInfo.push_back
299 (nonNegativeIntegerBlock(Tlv::SignatureType, Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800300 }
301 // KeyLocator
302 {
303 KeyLocator keyLocator;
304 keyLocator.setName("/test/key/locator");
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700305
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800306 signatureInfo.push_back(keyLocator.wireEncode());
307 }
308 signatureInfo.encode();
309
310 // SignatureValue
311 OBufferStream os;
312 Tlv::writeVarNumber(os, Tlv::SignatureValue);
313
314 using namespace CryptoPP;
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700315
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800316 RSASS<PKCS1v15, SHA256>::Signer signer(privateKey_);
317
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800318 PK_MessageAccumulator *hash = signer.NewSignatureAccumulator(rng_);
319 hash->Update(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
320 hash->Update(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
321 hash->Update(d.getContent(). wire(), d.getContent(). size());
322 hash->Update(signatureInfo. wire(), signatureInfo. size());
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700323
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800324 size_t length = signer.MaxSignatureLength();
325 SecByteBlock buf(length);
326 signer.Sign(rng_, hash, buf);
327
328 Tlv::writeVarNumber(os, buf.size());
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700329 os.write(reinterpret_cast<const char *>(buf.BytePtr()), buf.size());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800330
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700331 ndn::Block signatureValue(Block(os.buf()));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700332
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800333 Signature signature(signatureInfo, signatureValue);
334
335 d.setSignature(signature);
336
337 Block dataBlock;
338 BOOST_REQUIRE_NO_THROW(dataBlock = d.wireEncode());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800339
340 BOOST_REQUIRE_EQUAL_COLLECTIONS(Data1, Data1+sizeof(Data1),
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800341 dataBlock.begin(), dataBlock.end());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800342}
343
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700344BOOST_AUTO_TEST_CASE(EncodeMetaInfo)
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800345{
346 MetaInfo meta;
347 meta.setType(MetaInfo::TYPE_DEFAULT);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700348 meta.setFreshnessPeriod(time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800349
350 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
351 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo1, MetaInfo1+sizeof(MetaInfo1),
352 meta.wireEncode().begin(), meta.wireEncode().end());
353
354 meta.setFinalBlockId(name::Component("hello,world!"));
355 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
356 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo2, MetaInfo2+sizeof(MetaInfo2),
357 meta.wireEncode().begin(), meta.wireEncode().end());
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700358
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800359 meta.setType(MetaInfo::TYPE_LINK);
360 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
361 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo3, MetaInfo3+sizeof(MetaInfo3),
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700362 meta.wireEncode().begin(), meta.wireEncode().end());
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800363}
364
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700365BOOST_AUTO_TEST_CASE(DecodeMetaInfo)
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800366{
367 MetaInfo meta(Block(MetaInfo1, sizeof(MetaInfo1)));
368 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700369 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800370 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component());
371
372 meta.wireDecode(Block(MetaInfo2, sizeof(MetaInfo2)));
373 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700374 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800375 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component("hello,world!"));
376
377 meta.wireDecode(Block(MetaInfo3, sizeof(MetaInfo3)));
378 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_LINK));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700379 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800380 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component("hello,world!"));
381}
382
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800383BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800384
385} // namespace ndn