blob: a89011bc8db6d101f769c67ad6ab011a515adc56 [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
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());
190 ofstream of("data.tlv");
191 of.write((const char*)dataBlock.wire(), dataBlock.size());
192
193 BOOST_REQUIRE_EQUAL_COLLECTIONS(Data1, Data1+sizeof(Data1),
194 dataBlock.begin(), dataBlock.end());
195
196}
197
198BOOST_AUTO_TEST_SUITE_END()