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