blob: b833efa4162c53d7b38e93cf9129ba24ac0a12e2 [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
89class TestDataFixture
90{
91public:
92 TestDataFixture()
93 {
94 CryptoPP::StringSource source(DEFAULT_PRIVATE_KEY_DER, sizeof(DEFAULT_PRIVATE_KEY_DER), true);
95 privateKey_.Load(source);
96 publicKey_ = privateKey_;
97 }
98
99protected:
100 CryptoPP::AutoSeededRandomPool rng_;
101 CryptoPP::RSA::PrivateKey privateKey_;
102 CryptoPP::RSA::PublicKey publicKey_;
103};
104
105
106BOOST_FIXTURE_TEST_CASE (Decode, TestDataFixture)
107{
108 Block dataBlock(Data1, sizeof(Data1));
109
110 ndn::Data d;
111 // BOOST_REQUIRE_NO_THROW
112 (d.wireDecode(dataBlock));
113
114 BOOST_REQUIRE_EQUAL(d.getName().toUri(), "/local/ndn/prefix");
115 BOOST_REQUIRE_EQUAL(d.getContentType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
116 BOOST_REQUIRE_EQUAL(d.getFreshnessPeriod(), 10000);
117
118 BOOST_REQUIRE_EQUAL(std::string(reinterpret_cast<const char*>(d.getContent().value()), d.getContent().value_size()), "SUCCESS!");
119
Alexander Afanasyev76c51562014-01-03 15:13:48 -0800120 BOOST_REQUIRE_EQUAL(d.getSignature().getType(), static_cast<uint32_t>(Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800121 ndn::Block block = d.getSignature().getInfo();
122 block.parse();
123 KeyLocator keyLocator;
124 BOOST_REQUIRE_NO_THROW(keyLocator.wireDecode(block.get(Tlv::KeyLocator)));
125
126 BOOST_REQUIRE_EQUAL(keyLocator.getName().toUri(), "/test/key/locator");
127
128 using namespace CryptoPP;
129 RSASS<PKCS1v15, SHA256>::Verifier verifier(publicKey_);
130 bool signatureVerified = verifier.VerifyMessage(d.wireEncode().value(), d.wireEncode().value_size() - d.getSignature().getValue().size(),
131 d.getSignature().getValue().value(), d.getSignature().getValue().value_size());
132 BOOST_REQUIRE_EQUAL(signatureVerified, true);
133}
134
135BOOST_FIXTURE_TEST_CASE (Encode, TestDataFixture)
136{
137 // manual data packet creation for now
138
139 ndn::Data d(ndn::Name("/local/ndn/prefix"));
140 d.setContentType(MetaInfo::TYPE_DEFAULT);
141 d.setFreshnessPeriod(10000);
142
143 d.setContent(Content1, sizeof(Content1));
144
145 Block signatureInfo(Tlv::SignatureInfo);
146 // SignatureType
147 {
Alexander Afanasyev90df0002014-01-03 15:32:43 -0800148 signatureInfo.push_back
149 (nonNegativeIntegerBlock(Tlv::SignatureType, Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800150 }
151 // KeyLocator
152 {
153 KeyLocator keyLocator;
154 keyLocator.setName("/test/key/locator");
155
156 signatureInfo.push_back(keyLocator.wireEncode());
157 }
158 signatureInfo.encode();
159
160 // SignatureValue
161 OBufferStream os;
162 Tlv::writeVarNumber(os, Tlv::SignatureValue);
163
164 using namespace CryptoPP;
165
166 RSASS<PKCS1v15, SHA256>::Signer signer(privateKey_);
167
168 int i = 0;
169 PK_MessageAccumulator *hash = signer.NewSignatureAccumulator(rng_);
170 hash->Update(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
171 hash->Update(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
172 hash->Update(d.getContent(). wire(), d.getContent(). size());
173 hash->Update(signatureInfo. wire(), signatureInfo. size());
174
175 size_t length = signer.MaxSignatureLength();
176 SecByteBlock buf(length);
177 signer.Sign(rng_, hash, buf);
178
179 Tlv::writeVarNumber(os, buf.size());
180 os.write(reinterpret_cast<const char *> (buf.BytePtr()), buf.size());
181
182 ndn::Block signatureValue (Block(os.buf()));
183
184 Signature signature(signatureInfo, signatureValue);
185
186 d.setSignature(signature);
187
188 Block dataBlock;
189 BOOST_REQUIRE_NO_THROW(dataBlock = d.wireEncode());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800190
191 BOOST_REQUIRE_EQUAL_COLLECTIONS(Data1, Data1+sizeof(Data1),
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800192 dataBlock.begin(), dataBlock.end());
193
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800194
195}
196
197BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800198
199} // namespace ndn