blob: 1a3b97ec1e39e948b366eba7967c4b267513088f [file] [log] [blame]
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -08001/**
2 * Copyright (C) 2013 Regents of the University of California.
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -08003 * See COPYING for copyright and distribution information.
4 */
5
Alexander Afanasyev09c613f2014-01-29 00:23:58 -08006#include "data.hpp"
7#include "security/key-chain.hpp"
Junxiao Shi482ccc52014-03-31 13:05:24 -07008#include "security/cryptopp.hpp"
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -08009
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070010#include "boost-test.hpp"
11
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080012using namespace std;
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -080013namespace ndn {
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080014
15BOOST_AUTO_TEST_SUITE(TestData)
16
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -070017BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Data>));
18BOOST_CONCEPT_ASSERT((boost::EqualityComparable<MetaInfo>));
19BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Signature>));
20
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080021const uint8_t Content1[] = {0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21};
22
23const uint8_t Data1[] = {
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700240x06, 0xc5, // NDN Data
25 0x07, 0x14, // Name
26 0x08, 0x05,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080027 0x6c, 0x6f, 0x63, 0x61, 0x6c,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070028 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080029 0x6e, 0x64, 0x6e,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070030 0x08, 0x06,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080031 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080032 0x14, 0x04, // MetaInfo
33 0x19, 0x02, // FreshnessPeriod
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070034 0x27, 0x10,
35 0x15, 0x08, // Content
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080036 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080037 0x16, 0x1b, // SignatureInfo
38 0x1b, 0x01, // SignatureType
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070039 0x01,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080040 0x1c, 0x16, // KeyLocator
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070041 0x07, 0x14, // Name
42 0x08, 0x04,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080043 0x74, 0x65, 0x73, 0x74,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070044 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080045 0x6b, 0x65, 0x79,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070046 0x08, 0x07,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080047 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080048 0x17, 0x80, // SignatureValue
49 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec, 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6, 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38, 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc, 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf, 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9, 0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8, 0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7, 0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3, 0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080050};
51
52const unsigned char DEFAULT_PRIVATE_KEY_DER[] = {
530x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
540x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82, 0x02, 0x5a, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e,
550x47, 0x85, 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47, 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05, 0x3a, 0x24, 0x1e, 0xeb,
560x89, 0x01, 0xbb, 0xe9, 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68, 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7,
570x06, 0x90, 0x9c, 0xaa, 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3, 0x1b, 0x88, 0x9a, 0x97,
580x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82, 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d,
590x24, 0xc2, 0x63, 0xf3, 0x97, 0x17, 0xeb, 0xfe, 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f,
600xb8, 0xf2, 0xf1, 0xc5, 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed, 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76,
610x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11, 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0, 0x2a, 0xe3, 0x6b, 0x0c,
620x8b, 0x73, 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c, 0x5b, 0x43, 0x29, 0xad, 0x3a, 0x3b, 0x93, 0xa3,
630x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e, 0x33, 0x3f, 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44,
640x00, 0xde, 0x72, 0xed, 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2, 0x69, 0x1f,
650xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13, 0x06, 0x69, 0x06, 0xd8, 0x3f, 0x22, 0x15, 0x75,
660xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66, 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2, 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37,
670x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88, 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f, 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02,
680x41, 0x00, 0xb6, 0x2e, 0xbb, 0xcd, 0x2f, 0x3a, 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e,
690x64, 0xa7, 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae, 0xb0, 0x74, 0xa6, 0x99,
700xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e, 0x56, 0xad, 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c,
710xb7, 0x9a, 0x3e, 0x99, 0xef, 0xb9, 0x02, 0x41, 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1, 0xac, 0xee,
720xcb, 0x41, 0x81, 0xc6, 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21, 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96,
730x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8, 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6, 0x90, 0xb5, 0xce, 0x1b,
740x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a, 0x7f, 0x02, 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0,
750x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89, 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee,
760x51, 0x57, 0xd5, 0x97, 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e, 0x88, 0x63, 0xe2, 0x66,
770x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a, 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca, 0x78, 0xab, 0x21, 0x02,
780x41, 0x00, 0x8f, 0xae, 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24, 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81, 0xbc, 0x2c,
790x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d, 0x28, 0xd9, 0x10, 0x1a, 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14,
800xbf, 0xc9, 0xff, 0x17, 0xd6, 0x47, 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
810xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a, 0x33, 0x2f, 0x4b, 0xa2, 0xbd, 0xd1,
820xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15, 0x37, 0x1b, 0xde, 0x76, 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9,
830x4f, 0x35, 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95, 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21, 0x6d, 0xa0, 0x84, 0x39,
840xe9, 0x2e, 0x1e, 0xfc, 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d, 0x0a, 0xb6
85};
86
Alexander Afanasyev4b456282014-02-13 00:34:34 -080087const uint8_t MetaInfo1[] = {0x14, 0x04, 0x19, 0x02, 0x27, 0x10};
88const uint8_t MetaInfo2[] = {0x14, 0x14, 0x19, 0x02, 0x27, 0x10, 0x1a, 0x0e, 0x08, 0x0c, 0x68, 0x65, 0x6c, 0x6c, 0x6f,
Alexander Afanasyev95b0e342014-02-12 21:34:44 -080089 0x2c, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21};
Alexander Afanasyev4b456282014-02-13 00:34:34 -080090const uint8_t MetaInfo3[] = {0x14, 0x17, 0x18, 0x01, 0x01, 0x19, 0x02, 0x27, 0x10, 0x1a, 0x0e, 0x08, 0x0c, 0x68, 0x65,
Alexander Afanasyev95b0e342014-02-12 21:34:44 -080091 0x6c, 0x6c, 0x6f, 0x2c, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21};
92
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -070093BOOST_AUTO_TEST_CASE(DataEqualityChecks)
94{
95 using namespace time;
96
97 Data a;
98 Data b;
99 BOOST_CHECK_EQUAL(a == b, true);
100 BOOST_CHECK_EQUAL(a != b, false);
101
102 a.setName("ndn:/A");
103 BOOST_CHECK_EQUAL(a == b, false);
104 BOOST_CHECK_EQUAL(a != b, true);
105
106 b.setName("ndn:/B");
107 BOOST_CHECK_EQUAL(a == b, false);
108 BOOST_CHECK_EQUAL(a != b, true);
109
110 b.setName("ndn:/A");
111 BOOST_CHECK_EQUAL(a == b, true);
112 BOOST_CHECK_EQUAL(a != b, false);
113
114 a.setFreshnessPeriod(seconds(10));
115 BOOST_CHECK_EQUAL(a == b, false);
116 BOOST_CHECK_EQUAL(a != b, true);
117
118 b.setFreshnessPeriod(seconds(10));
119 BOOST_CHECK_EQUAL(a == b, true);
120 BOOST_CHECK_EQUAL(a != b, false);
121
122 static const uint8_t someData[] = "someData";
123 a.setContent(someData, sizeof(someData));
124 BOOST_CHECK_EQUAL(a == b, false);
125 BOOST_CHECK_EQUAL(a != b, true);
126
127 b.setContent(someData, sizeof(someData));
128 BOOST_CHECK_EQUAL(a == b, true);
129 BOOST_CHECK_EQUAL(a != b, false);
130
131 a.setSignature(SignatureSha256WithRsa());
132 BOOST_CHECK_EQUAL(a == b, false);
133 BOOST_CHECK_EQUAL(a != b, true);
134
135 b.setSignature(SignatureSha256WithRsa());
136 BOOST_CHECK_EQUAL(a == b, true);
137 BOOST_CHECK_EQUAL(a != b, false);
138}
139
140BOOST_AUTO_TEST_CASE(MetaInfoEqualityChecks)
141{
142 using namespace time;
143
144 MetaInfo a;
145 MetaInfo b;
146 BOOST_CHECK_EQUAL(a == b, true);
147 BOOST_CHECK_EQUAL(a != b, false);
148
149 a.setFreshnessPeriod(seconds(10));
150 BOOST_CHECK_EQUAL(a == b, false);
151 BOOST_CHECK_EQUAL(a != b, true);
152
153 b.setFreshnessPeriod(milliseconds(90000));
154 BOOST_CHECK_EQUAL(a == b, false);
155 BOOST_CHECK_EQUAL(a != b, true);
156
157 b.setFreshnessPeriod(milliseconds(10000));
158 BOOST_CHECK_EQUAL(a == b, true);
159 BOOST_CHECK_EQUAL(a != b, false);
160
161 a.setType(10);
162 BOOST_CHECK_EQUAL(a == b, false);
163 BOOST_CHECK_EQUAL(a != b, true);
164
165 b.setType(10);
166 BOOST_CHECK_EQUAL(a == b, true);
167 BOOST_CHECK_EQUAL(a != b, false);
168}
169
170BOOST_AUTO_TEST_CASE(SignatureEqualityChecks)
171{
172 Signature a;
173 Signature b;
174
175 BOOST_CHECK_EQUAL(a == b, true);
176 BOOST_CHECK_EQUAL(a != b, false);
177
178 a = SignatureSha256WithRsa();
179 BOOST_CHECK_EQUAL(a == b, false);
180 BOOST_CHECK_EQUAL(a != b, true);
181
182 b = SignatureSha256WithRsa();
183 static const uint8_t someData[256] = {};
184 Block signatureValue = dataBlock(Tlv::SignatureValue, someData, sizeof(someData));
185 b.setValue(signatureValue);
186 BOOST_CHECK_EQUAL(a == b, false);
187 BOOST_CHECK_EQUAL(a != b, true);
188
189 a.setValue(signatureValue);
190 BOOST_CHECK_EQUAL(a == b, true);
191 BOOST_CHECK_EQUAL(a != b, false);
192
193 a = SignatureSha256();
194 b = SignatureSha256WithRsa();
195 BOOST_CHECK_EQUAL(a == b, false);
196 BOOST_CHECK_EQUAL(a != b, true);
197
198 b = SignatureSha256();
199 BOOST_CHECK_EQUAL(a == b, true);
200 BOOST_CHECK_EQUAL(a != b, false);
201}
202
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800203class TestDataFixture
204{
205public:
206 TestDataFixture()
207 {
208 CryptoPP::StringSource source(DEFAULT_PRIVATE_KEY_DER, sizeof(DEFAULT_PRIVATE_KEY_DER), true);
209 privateKey_.Load(source);
210 publicKey_ = privateKey_;
211 }
212
213protected:
214 CryptoPP::AutoSeededRandomPool rng_;
215 CryptoPP::RSA::PrivateKey privateKey_;
216 CryptoPP::RSA::PublicKey publicKey_;
217};
218
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700219BOOST_FIXTURE_TEST_CASE(Decode, TestDataFixture)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800220{
221 Block dataBlock(Data1, sizeof(Data1));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700222
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800223 ndn::Data d;
224 // BOOST_REQUIRE_NO_THROW
225 (d.wireDecode(dataBlock));
226
227 BOOST_REQUIRE_EQUAL(d.getName().toUri(), "/local/ndn/prefix");
228 BOOST_REQUIRE_EQUAL(d.getContentType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700229 BOOST_REQUIRE_EQUAL(d.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800230
231 BOOST_REQUIRE_EQUAL(std::string(reinterpret_cast<const char*>(d.getContent().value()), d.getContent().value_size()), "SUCCESS!");
232
Alexander Afanasyev76c51562014-01-03 15:13:48 -0800233 BOOST_REQUIRE_EQUAL(d.getSignature().getType(), static_cast<uint32_t>(Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800234 ndn::Block block = d.getSignature().getInfo();
235 block.parse();
236 KeyLocator keyLocator;
237 BOOST_REQUIRE_NO_THROW(keyLocator.wireDecode(block.get(Tlv::KeyLocator)));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700238
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800239 BOOST_REQUIRE_EQUAL(keyLocator.getName().toUri(), "/test/key/locator");
240
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700241 using namespace CryptoPP;
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800242 RSASS<PKCS1v15, SHA256>::Verifier verifier(publicKey_);
243 bool signatureVerified = verifier.VerifyMessage(d.wireEncode().value(), d.wireEncode().value_size() - d.getSignature().getValue().size(),
244 d.getSignature().getValue().value(), d.getSignature().getValue().value_size());
245 BOOST_REQUIRE_EQUAL(signatureVerified, true);
246}
247
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700248BOOST_FIXTURE_TEST_CASE(Encode, TestDataFixture)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800249{
250 // manual data packet creation for now
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700251
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800252 ndn::Data d(ndn::Name("/local/ndn/prefix"));
253 d.setContentType(MetaInfo::TYPE_DEFAULT);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700254 d.setFreshnessPeriod(time::seconds(10));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700255
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800256 d.setContent(Content1, sizeof(Content1));
257
258 Block signatureInfo(Tlv::SignatureInfo);
259 // SignatureType
260 {
Alexander Afanasyev90df0002014-01-03 15:32:43 -0800261 signatureInfo.push_back
262 (nonNegativeIntegerBlock(Tlv::SignatureType, Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800263 }
264 // KeyLocator
265 {
266 KeyLocator keyLocator;
267 keyLocator.setName("/test/key/locator");
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700268
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800269 signatureInfo.push_back(keyLocator.wireEncode());
270 }
271 signatureInfo.encode();
272
273 // SignatureValue
274 OBufferStream os;
275 Tlv::writeVarNumber(os, Tlv::SignatureValue);
276
277 using namespace CryptoPP;
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700278
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800279 RSASS<PKCS1v15, SHA256>::Signer signer(privateKey_);
280
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800281 PK_MessageAccumulator *hash = signer.NewSignatureAccumulator(rng_);
282 hash->Update(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
283 hash->Update(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
284 hash->Update(d.getContent(). wire(), d.getContent(). size());
285 hash->Update(signatureInfo. wire(), signatureInfo. size());
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700286
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800287 size_t length = signer.MaxSignatureLength();
288 SecByteBlock buf(length);
289 signer.Sign(rng_, hash, buf);
290
291 Tlv::writeVarNumber(os, buf.size());
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700292 os.write(reinterpret_cast<const char *>(buf.BytePtr()), buf.size());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800293
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700294 ndn::Block signatureValue(Block(os.buf()));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700295
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800296 Signature signature(signatureInfo, signatureValue);
297
298 d.setSignature(signature);
299
300 Block dataBlock;
301 BOOST_REQUIRE_NO_THROW(dataBlock = d.wireEncode());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800302
303 BOOST_REQUIRE_EQUAL_COLLECTIONS(Data1, Data1+sizeof(Data1),
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800304 dataBlock.begin(), dataBlock.end());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800305}
306
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700307BOOST_AUTO_TEST_CASE(EncodeMetaInfo)
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800308{
309 MetaInfo meta;
310 meta.setType(MetaInfo::TYPE_DEFAULT);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700311 meta.setFreshnessPeriod(time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800312
313 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
314 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo1, MetaInfo1+sizeof(MetaInfo1),
315 meta.wireEncode().begin(), meta.wireEncode().end());
316
317 meta.setFinalBlockId(name::Component("hello,world!"));
318 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
319 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo2, MetaInfo2+sizeof(MetaInfo2),
320 meta.wireEncode().begin(), meta.wireEncode().end());
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700321
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800322 meta.setType(MetaInfo::TYPE_LINK);
323 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
324 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo3, MetaInfo3+sizeof(MetaInfo3),
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700325 meta.wireEncode().begin(), meta.wireEncode().end());
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800326}
327
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700328BOOST_AUTO_TEST_CASE(DecodeMetaInfo)
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800329{
330 MetaInfo meta(Block(MetaInfo1, sizeof(MetaInfo1)));
331 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700332 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800333 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component());
334
335 meta.wireDecode(Block(MetaInfo2, sizeof(MetaInfo2)));
336 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700337 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800338 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component("hello,world!"));
339
340 meta.wireDecode(Block(MetaInfo3, sizeof(MetaInfo3)));
341 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_LINK));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700342 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800343 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component("hello,world!"));
344}
345
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800346BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800347
348} // namespace ndn