blob: 3c07e88451cd8d4c98dae38336fc08c209c8df8a [file] [log] [blame]
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -08001/**
2 * Copyright (C) 2013 Regents of the University of California.
3 * @author: Jeff Thompson <jefft0@remap.ucla.edu>
4 * See COPYING for copyright and distribution information.
5 */
6
7#include <boost/test/unit_test.hpp>
8
9#include <ndn-cpp/data.hpp>
10#include <ndn-cpp/security/key-chain.hpp>
11
12#include <fstream>
13
14#include <cryptopp/rsa.h>
15#include <cryptopp/osrng.h>
16#include <cryptopp/files.h>
17
18using namespace std;
19using namespace ndn;
20
21BOOST_AUTO_TEST_SUITE(TestData)
22
23const uint8_t Content1[] = {0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21};
24
25const uint8_t Data1[] = {
260x01, 0xc5, // NDN Data
27 0x02, 0x14, // Name
28 0x03, 0x05,
29 0x6c, 0x6f, 0x63, 0x61, 0x6c,
30 0x03, 0x03,
31 0x6e, 0x64, 0x6e,
32 0x03, 0x06,
33 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
34 0x0f, 0x04, // MetaInfo
35 0x14, 0x02, // FreshnessPeriod
36 0x27, 0x10,
37 0x10, 0x08, // Content
38 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
39 0x11, 0x1b, // SignatureInfo
40 0x15, 0x01, // SignatureType
41 0x01,
42 0x16, 0x16, // KeyLocator
43 0x02, 0x14, // Name
44 0x03, 0x04,
45 0x74, 0x65, 0x73, 0x74,
46 0x03, 0x03,
47 0x6b, 0x65, 0x79,
48 0x03, 0x07,
49 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
50 0x12, 0x80, // SignatureValue
51 0x41, 0x66, 0x82, 0xca, 0xdc, 0xf0, 0x34, 0x7a, 0x29, 0xba, 0x34, 0x0c, 0xaf, 0xdd, 0xc5, 0x9c, 0x98, 0xf1, 0xa1, 0x34, 0x83, 0xed, 0xec, 0xa0, 0xc5, 0x1a, 0xa2, 0xfd, 0xbc, 0x81, 0xb9, 0x30, 0xdd, 0x56, 0x7e, 0x3f, 0x55, 0xec, 0xea, 0x14, 0xcf, 0x89, 0x47, 0x92, 0x30, 0xa5, 0x93, 0x05, 0x96, 0xe9, 0x97, 0xc6, 0xe4, 0x82, 0x97, 0x7a, 0xf1, 0x89, 0x07, 0xf6, 0xd8, 0x5a, 0x63, 0xf8, 0xbd, 0x99, 0xeb, 0xf7, 0xcd, 0xfe, 0x48, 0xd2, 0x2b, 0x5c, 0xbb, 0xf5, 0xa9, 0x96, 0x81, 0x8f, 0xff, 0xc4, 0x40, 0x8a, 0xa5, 0x20, 0x4f, 0x97, 0xcd, 0x77, 0x47, 0xd9, 0xa9, 0x19, 0xcd, 0x09, 0xa1, 0xd2, 0x8e, 0x52, 0x90, 0xec, 0xd0, 0x96, 0x70, 0x5c, 0xe4, 0xaa, 0x38, 0xeb, 0xd5, 0x01, 0xc4, 0xf1, 0xd3, 0xdb, 0x9a, 0xc6, 0xa6, 0x39, 0xa1, 0x19, 0xa5, 0x84, 0x9d, 0xab, 0xd5, 0x68
52};
53
54const 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
120 BOOST_REQUIRE_EQUAL(d.getSignature().getType(), static_cast<uint32_t>(Signature::SignatureSha256WithRsa));
121 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 {
148 OBufferStream os;
149 Tlv::writeVarNumber(os, Tlv::SignatureType);
150 Tlv::writeVarNumber(os, Tlv::sizeOfNonNegativeInteger(Signature::SignatureSha256WithRsa));
151 Tlv::writeNonNegativeInteger(os, Signature::SignatureSha256WithRsa);
152
153 signatureInfo.push_back(Block(os.buf()));
154 }
155 // KeyLocator
156 {
157 KeyLocator keyLocator;
158 keyLocator.setName("/test/key/locator");
159
160 signatureInfo.push_back(keyLocator.wireEncode());
161 }
162 signatureInfo.encode();
163
164 // SignatureValue
165 OBufferStream os;
166 Tlv::writeVarNumber(os, Tlv::SignatureValue);
167
168 using namespace CryptoPP;
169
170 RSASS<PKCS1v15, SHA256>::Signer signer(privateKey_);
171
172 int i = 0;
173 PK_MessageAccumulator *hash = signer.NewSignatureAccumulator(rng_);
174 hash->Update(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
175 hash->Update(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
176 hash->Update(d.getContent(). wire(), d.getContent(). size());
177 hash->Update(signatureInfo. wire(), signatureInfo. size());
178
179 size_t length = signer.MaxSignatureLength();
180 SecByteBlock buf(length);
181 signer.Sign(rng_, hash, buf);
182
183 Tlv::writeVarNumber(os, buf.size());
184 os.write(reinterpret_cast<const char *> (buf.BytePtr()), buf.size());
185
186 ndn::Block signatureValue (Block(os.buf()));
187
188 Signature signature(signatureInfo, signatureValue);
189
190 d.setSignature(signature);
191
192 Block dataBlock;
193 BOOST_REQUIRE_NO_THROW(dataBlock = d.wireEncode());
194 ofstream of("data.tlv");
195 of.write((const char*)dataBlock.wire(), dataBlock.size());
196
197 BOOST_REQUIRE_EQUAL_COLLECTIONS(Data1, Data1+sizeof(Data1),
198 dataBlock.begin(), dataBlock.end());
199
200}
201
202BOOST_AUTO_TEST_SUITE_END()