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