blob: f9dc96ad77c6cce5afb60c99364b354886098c33 [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
6#include <boost/test/unit_test.hpp>
7
Alexander Afanasyev09c613f2014-01-29 00:23:58 -08008#include "data.hpp"
9#include "security/key-chain.hpp"
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080010
11#include <fstream>
12
13#include <cryptopp/rsa.h>
14#include <cryptopp/osrng.h>
15#include <cryptopp/files.h>
16
17using namespace std;
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -080018namespace ndn {
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080019
20BOOST_AUTO_TEST_SUITE(TestData)
21
22const uint8_t Content1[] = {0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21};
23
24const uint8_t Data1[] = {
Alexander Afanasyev6835ad82014-02-12 10:07:20 -0800250x04, 0xc5, // NDN Data
26 0x01, 0x14, // Name
27 0x02, 0x05,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080028 0x6c, 0x6f, 0x63, 0x61, 0x6c,
Alexander Afanasyev6835ad82014-02-12 10:07:20 -080029 0x02, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080030 0x6e, 0x64, 0x6e,
Alexander Afanasyev6835ad82014-02-12 10:07:20 -080031 0x02, 0x06,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080032 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080033 0x10, 0x04, // MetaInfo
34 0x15, 0x02, // FreshnessPeriod
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080035 0x27, 0x10,
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080036 0x11, 0x08, // Content
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080037 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080038 0x12, 0x1b, // SignatureInfo
39 0x16, 0x01, // SignatureType
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080040 0x01,
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080041 0x17, 0x16, // KeyLocator
Alexander Afanasyev6835ad82014-02-12 10:07:20 -080042 0x01, 0x14, // Name
43 0x02, 0x04,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080044 0x74, 0x65, 0x73, 0x74,
Alexander Afanasyev6835ad82014-02-12 10:07:20 -080045 0x02, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080046 0x6b, 0x65, 0x79,
Alexander Afanasyev6835ad82014-02-12 10:07:20 -080047 0x02, 0x07,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080048 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080049 0x13, 0x80, // SignatureValue
Alexander Afanasyev6835ad82014-02-12 10:07:20 -080050 0x96, 0xa7, 0x5d, 0x91, 0xc1, 0x1c, 0xa9, 0x96, 0x93, 0x7e, 0x6b, 0x2d, 0x5a, 0x86, 0x98, 0xce, 0x55, 0xb8, 0x4a, 0x91, 0xc6, 0x5d, 0x69, 0x71, 0x47, 0x0c, 0x6b, 0x70, 0xa2, 0x82, 0xef, 0x48, 0x69, 0x24, 0x71, 0xd5, 0xb2, 0xda, 0x6d, 0x26, 0xde, 0x8d, 0xb8, 0x37, 0x8e, 0xd7, 0xc2, 0xd9, 0xad, 0xd9, 0x97, 0xf8, 0xdd, 0xab, 0x36, 0x49, 0x77, 0xff, 0x12, 0x83, 0xa3, 0x0b, 0xf0, 0xac, 0x52, 0x08, 0xb5, 0xa4, 0x67, 0x16, 0x2a, 0x5e, 0x76, 0xc3, 0x06, 0x27, 0x3e, 0x5b, 0x13, 0x26, 0x18, 0x9c, 0x0d, 0x22, 0xb8, 0x9c, 0x24, 0x63, 0x06, 0x73, 0xe8, 0xc1, 0x27, 0x21, 0xe3, 0x92, 0x88, 0x49, 0xf3, 0xc3, 0xa8, 0xc5, 0xa8, 0x74, 0x57, 0xf9, 0xd6, 0x0c, 0x4f, 0x97, 0x9a, 0x7e, 0x7c, 0x03, 0xdb, 0x47, 0x11, 0xa0, 0xaf, 0x67, 0x44, 0x54, 0x66, 0x0e, 0x12, 0xd6, 0x39, 0xb3
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080051};
52
Alexander Afanasyev6835ad82014-02-12 10:07:20 -080053
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080054const unsigned char DEFAULT_PRIVATE_KEY_DER[] = {
550x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
560x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82, 0x02, 0x5a, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e,
570x47, 0x85, 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47, 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05, 0x3a, 0x24, 0x1e, 0xeb,
580x89, 0x01, 0xbb, 0xe9, 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68, 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7,
590x06, 0x90, 0x9c, 0xaa, 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3, 0x1b, 0x88, 0x9a, 0x97,
600x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82, 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d,
610x24, 0xc2, 0x63, 0xf3, 0x97, 0x17, 0xeb, 0xfe, 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f,
620xb8, 0xf2, 0xf1, 0xc5, 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed, 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76,
630x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11, 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0, 0x2a, 0xe3, 0x6b, 0x0c,
640x8b, 0x73, 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c, 0x5b, 0x43, 0x29, 0xad, 0x3a, 0x3b, 0x93, 0xa3,
650x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e, 0x33, 0x3f, 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44,
660x00, 0xde, 0x72, 0xed, 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2, 0x69, 0x1f,
670xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13, 0x06, 0x69, 0x06, 0xd8, 0x3f, 0x22, 0x15, 0x75,
680xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66, 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2, 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37,
690x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88, 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f, 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02,
700x41, 0x00, 0xb6, 0x2e, 0xbb, 0xcd, 0x2f, 0x3a, 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e,
710x64, 0xa7, 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae, 0xb0, 0x74, 0xa6, 0x99,
720xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e, 0x56, 0xad, 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c,
730xb7, 0x9a, 0x3e, 0x99, 0xef, 0xb9, 0x02, 0x41, 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1, 0xac, 0xee,
740xcb, 0x41, 0x81, 0xc6, 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21, 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96,
750x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8, 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6, 0x90, 0xb5, 0xce, 0x1b,
760x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a, 0x7f, 0x02, 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0,
770x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89, 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee,
780x51, 0x57, 0xd5, 0x97, 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e, 0x88, 0x63, 0xe2, 0x66,
790x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a, 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca, 0x78, 0xab, 0x21, 0x02,
800x41, 0x00, 0x8f, 0xae, 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24, 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81, 0xbc, 0x2c,
810x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d, 0x28, 0xd9, 0x10, 0x1a, 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14,
820xbf, 0xc9, 0xff, 0x17, 0xd6, 0x47, 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
830xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a, 0x33, 0x2f, 0x4b, 0xa2, 0xbd, 0xd1,
840xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15, 0x37, 0x1b, 0xde, 0x76, 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9,
850x4f, 0x35, 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95, 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21, 0x6d, 0xa0, 0x84, 0x39,
860xe9, 0x2e, 0x1e, 0xfc, 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d, 0x0a, 0xb6
87};
88
Alexander Afanasyev95b0e342014-02-12 21:34:44 -080089const uint8_t MetaInfo1[] = {0x10, 0x04, 0x15, 0x02, 0x27, 0x10};
90const uint8_t MetaInfo2[] = {0x10, 0x14, 0x15, 0x02, 0x27, 0x10, 0x19, 0x0e, 0x02, 0x0c, 0x68, 0x65, 0x6c, 0x6c, 0x6f,
91 0x2c, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21};
92const uint8_t MetaInfo3[] = {0x10, 0x17, 0x14, 0x01, 0x01, 0x15, 0x02, 0x27, 0x10, 0x19, 0x0e, 0x02, 0x0c, 0x68, 0x65,
93 0x6c, 0x6c, 0x6f, 0x2c, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21};
94
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080095class TestDataFixture
96{
97public:
98 TestDataFixture()
99 {
100 CryptoPP::StringSource source(DEFAULT_PRIVATE_KEY_DER, sizeof(DEFAULT_PRIVATE_KEY_DER), true);
101 privateKey_.Load(source);
102 publicKey_ = privateKey_;
103 }
104
105protected:
106 CryptoPP::AutoSeededRandomPool rng_;
107 CryptoPP::RSA::PrivateKey privateKey_;
108 CryptoPP::RSA::PublicKey publicKey_;
109};
110
111
112BOOST_FIXTURE_TEST_CASE (Decode, TestDataFixture)
113{
114 Block dataBlock(Data1, sizeof(Data1));
115
116 ndn::Data d;
117 // BOOST_REQUIRE_NO_THROW
118 (d.wireDecode(dataBlock));
119
120 BOOST_REQUIRE_EQUAL(d.getName().toUri(), "/local/ndn/prefix");
121 BOOST_REQUIRE_EQUAL(d.getContentType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
122 BOOST_REQUIRE_EQUAL(d.getFreshnessPeriod(), 10000);
123
124 BOOST_REQUIRE_EQUAL(std::string(reinterpret_cast<const char*>(d.getContent().value()), d.getContent().value_size()), "SUCCESS!");
125
Alexander Afanasyev76c51562014-01-03 15:13:48 -0800126 BOOST_REQUIRE_EQUAL(d.getSignature().getType(), static_cast<uint32_t>(Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800127 ndn::Block block = d.getSignature().getInfo();
128 block.parse();
129 KeyLocator keyLocator;
130 BOOST_REQUIRE_NO_THROW(keyLocator.wireDecode(block.get(Tlv::KeyLocator)));
131
132 BOOST_REQUIRE_EQUAL(keyLocator.getName().toUri(), "/test/key/locator");
133
134 using namespace CryptoPP;
135 RSASS<PKCS1v15, SHA256>::Verifier verifier(publicKey_);
136 bool signatureVerified = verifier.VerifyMessage(d.wireEncode().value(), d.wireEncode().value_size() - d.getSignature().getValue().size(),
137 d.getSignature().getValue().value(), d.getSignature().getValue().value_size());
138 BOOST_REQUIRE_EQUAL(signatureVerified, true);
139}
140
141BOOST_FIXTURE_TEST_CASE (Encode, TestDataFixture)
142{
143 // manual data packet creation for now
144
145 ndn::Data d(ndn::Name("/local/ndn/prefix"));
146 d.setContentType(MetaInfo::TYPE_DEFAULT);
147 d.setFreshnessPeriod(10000);
148
149 d.setContent(Content1, sizeof(Content1));
150
151 Block signatureInfo(Tlv::SignatureInfo);
152 // SignatureType
153 {
Alexander Afanasyev90df0002014-01-03 15:32:43 -0800154 signatureInfo.push_back
155 (nonNegativeIntegerBlock(Tlv::SignatureType, Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800156 }
157 // KeyLocator
158 {
159 KeyLocator keyLocator;
160 keyLocator.setName("/test/key/locator");
161
162 signatureInfo.push_back(keyLocator.wireEncode());
163 }
164 signatureInfo.encode();
165
166 // SignatureValue
167 OBufferStream os;
168 Tlv::writeVarNumber(os, Tlv::SignatureValue);
169
170 using namespace CryptoPP;
171
172 RSASS<PKCS1v15, SHA256>::Signer signer(privateKey_);
173
174 int i = 0;
175 PK_MessageAccumulator *hash = signer.NewSignatureAccumulator(rng_);
176 hash->Update(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
177 hash->Update(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
178 hash->Update(d.getContent(). wire(), d.getContent(). size());
179 hash->Update(signatureInfo. wire(), signatureInfo. size());
180
181 size_t length = signer.MaxSignatureLength();
182 SecByteBlock buf(length);
183 signer.Sign(rng_, hash, buf);
184
185 Tlv::writeVarNumber(os, buf.size());
186 os.write(reinterpret_cast<const char *> (buf.BytePtr()), buf.size());
187
188 ndn::Block signatureValue (Block(os.buf()));
189
190 Signature signature(signatureInfo, signatureValue);
191
192 d.setSignature(signature);
193
194 Block dataBlock;
195 BOOST_REQUIRE_NO_THROW(dataBlock = d.wireEncode());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800196
197 BOOST_REQUIRE_EQUAL_COLLECTIONS(Data1, Data1+sizeof(Data1),
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800198 dataBlock.begin(), dataBlock.end());
199
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800200
201}
202
Alexander Afanasyev95b0e342014-02-12 21:34:44 -0800203BOOST_AUTO_TEST_CASE (EncodeMetaInfo)
204{
205 MetaInfo meta;
206 meta.setType(MetaInfo::TYPE_DEFAULT);
207 meta.setFreshnessPeriod(10000);
208
209 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
210 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo1, MetaInfo1+sizeof(MetaInfo1),
211 meta.wireEncode().begin(), meta.wireEncode().end());
212
213 meta.setFinalBlockId(name::Component("hello,world!"));
214 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
215 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo2, MetaInfo2+sizeof(MetaInfo2),
216 meta.wireEncode().begin(), meta.wireEncode().end());
217
218 meta.setType(MetaInfo::TYPE_LINK);
219 BOOST_REQUIRE_NO_THROW(meta.wireEncode());
220 BOOST_REQUIRE_EQUAL_COLLECTIONS(MetaInfo3, MetaInfo3+sizeof(MetaInfo3),
221 meta.wireEncode().begin(), meta.wireEncode().end());
222}
223
224BOOST_AUTO_TEST_CASE (DecodeMetaInfo)
225{
226 MetaInfo meta(Block(MetaInfo1, sizeof(MetaInfo1)));
227 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
228 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), 10000);
229 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component());
230
231 meta.wireDecode(Block(MetaInfo2, sizeof(MetaInfo2)));
232 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
233 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), 10000);
234 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component("hello,world!"));
235
236 meta.wireDecode(Block(MetaInfo3, sizeof(MetaInfo3)));
237 BOOST_CHECK_EQUAL(meta.getType(), static_cast<uint32_t>(MetaInfo::TYPE_LINK));
238 BOOST_CHECK_EQUAL(meta.getFreshnessPeriod(), 10000);
239 BOOST_CHECK_EQUAL(meta.getFinalBlockId(), name::Component("hello,world!"));
240}
241
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800242BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800243
244} // namespace ndn