blob: 198fe71256af8753b16a05f444495e0ad9976a07 [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
Alexander Afanasyevfad679c2014-01-06 18:09:26 -080014#if __clang__
15#pragma clang diagnostic push
16#pragma clang diagnostic ignored "-Wtautological-compare"
17#endif
18
19
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080020#include <cryptopp/rsa.h>
21#include <cryptopp/osrng.h>
22#include <cryptopp/files.h>
23
24using namespace std;
25using namespace ndn;
26
27BOOST_AUTO_TEST_SUITE(TestData)
28
29const uint8_t Content1[] = {0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21};
30
31const uint8_t Data1[] = {
320x01, 0xc5, // NDN Data
33 0x02, 0x14, // Name
34 0x03, 0x05,
35 0x6c, 0x6f, 0x63, 0x61, 0x6c,
36 0x03, 0x03,
37 0x6e, 0x64, 0x6e,
38 0x03, 0x06,
39 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
40 0x0f, 0x04, // MetaInfo
41 0x14, 0x02, // FreshnessPeriod
42 0x27, 0x10,
43 0x10, 0x08, // Content
44 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
45 0x11, 0x1b, // SignatureInfo
46 0x15, 0x01, // SignatureType
47 0x01,
48 0x16, 0x16, // KeyLocator
49 0x02, 0x14, // Name
50 0x03, 0x04,
51 0x74, 0x65, 0x73, 0x74,
52 0x03, 0x03,
53 0x6b, 0x65, 0x79,
54 0x03, 0x07,
55 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
56 0x12, 0x80, // SignatureValue
57 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
58};
59
60const unsigned char DEFAULT_PRIVATE_KEY_DER[] = {
610x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
620x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82, 0x02, 0x5a, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e,
630x47, 0x85, 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47, 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05, 0x3a, 0x24, 0x1e, 0xeb,
640x89, 0x01, 0xbb, 0xe9, 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68, 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7,
650x06, 0x90, 0x9c, 0xaa, 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3, 0x1b, 0x88, 0x9a, 0x97,
660x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82, 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d,
670x24, 0xc2, 0x63, 0xf3, 0x97, 0x17, 0xeb, 0xfe, 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f,
680xb8, 0xf2, 0xf1, 0xc5, 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed, 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76,
690x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11, 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0, 0x2a, 0xe3, 0x6b, 0x0c,
700x8b, 0x73, 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c, 0x5b, 0x43, 0x29, 0xad, 0x3a, 0x3b, 0x93, 0xa3,
710x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e, 0x33, 0x3f, 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44,
720x00, 0xde, 0x72, 0xed, 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2, 0x69, 0x1f,
730xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13, 0x06, 0x69, 0x06, 0xd8, 0x3f, 0x22, 0x15, 0x75,
740xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66, 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2, 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37,
750x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88, 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f, 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02,
760x41, 0x00, 0xb6, 0x2e, 0xbb, 0xcd, 0x2f, 0x3a, 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e,
770x64, 0xa7, 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae, 0xb0, 0x74, 0xa6, 0x99,
780xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e, 0x56, 0xad, 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c,
790xb7, 0x9a, 0x3e, 0x99, 0xef, 0xb9, 0x02, 0x41, 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1, 0xac, 0xee,
800xcb, 0x41, 0x81, 0xc6, 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21, 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96,
810x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8, 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6, 0x90, 0xb5, 0xce, 0x1b,
820x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a, 0x7f, 0x02, 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0,
830x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89, 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee,
840x51, 0x57, 0xd5, 0x97, 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e, 0x88, 0x63, 0xe2, 0x66,
850x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a, 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca, 0x78, 0xab, 0x21, 0x02,
860x41, 0x00, 0x8f, 0xae, 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24, 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81, 0xbc, 0x2c,
870x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d, 0x28, 0xd9, 0x10, 0x1a, 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14,
880xbf, 0xc9, 0xff, 0x17, 0xd6, 0x47, 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
890xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a, 0x33, 0x2f, 0x4b, 0xa2, 0xbd, 0xd1,
900xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15, 0x37, 0x1b, 0xde, 0x76, 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9,
910x4f, 0x35, 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95, 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21, 0x6d, 0xa0, 0x84, 0x39,
920xe9, 0x2e, 0x1e, 0xfc, 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d, 0x0a, 0xb6
93};
94
95class TestDataFixture
96{
97public:
98 TestDataFixture()
99 {
100 CryptoPP::StringSource source(DEFAULT_PRIVATE_KEY_DER, sizeof(DEFAULT_PRIVATE_KEY_DER), true);
101 privateKey_.Load(source);
102 publicKey_ = privateKey_;
103 }
104
105protected:
106 CryptoPP::AutoSeededRandomPool rng_;
107 CryptoPP::RSA::PrivateKey privateKey_;
108 CryptoPP::RSA::PublicKey publicKey_;
109};
110
111
112BOOST_FIXTURE_TEST_CASE (Decode, TestDataFixture)
113{
114 Block dataBlock(Data1, sizeof(Data1));
115
116 ndn::Data d;
117 // BOOST_REQUIRE_NO_THROW
118 (d.wireDecode(dataBlock));
119
120 BOOST_REQUIRE_EQUAL(d.getName().toUri(), "/local/ndn/prefix");
121 BOOST_REQUIRE_EQUAL(d.getContentType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
122 BOOST_REQUIRE_EQUAL(d.getFreshnessPeriod(), 10000);
123
124 BOOST_REQUIRE_EQUAL(std::string(reinterpret_cast<const char*>(d.getContent().value()), d.getContent().value_size()), "SUCCESS!");
125
Alexander Afanasyev76c51562014-01-03 15:13:48 -0800126 BOOST_REQUIRE_EQUAL(d.getSignature().getType(), static_cast<uint32_t>(Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800127 ndn::Block block = d.getSignature().getInfo();
128 block.parse();
129 KeyLocator keyLocator;
130 BOOST_REQUIRE_NO_THROW(keyLocator.wireDecode(block.get(Tlv::KeyLocator)));
131
132 BOOST_REQUIRE_EQUAL(keyLocator.getName().toUri(), "/test/key/locator");
133
134 using namespace CryptoPP;
135 RSASS<PKCS1v15, SHA256>::Verifier verifier(publicKey_);
136 bool signatureVerified = verifier.VerifyMessage(d.wireEncode().value(), d.wireEncode().value_size() - d.getSignature().getValue().size(),
137 d.getSignature().getValue().value(), d.getSignature().getValue().value_size());
138 BOOST_REQUIRE_EQUAL(signatureVerified, true);
139}
140
141BOOST_FIXTURE_TEST_CASE (Encode, TestDataFixture)
142{
143 // manual data packet creation for now
144
145 ndn::Data d(ndn::Name("/local/ndn/prefix"));
146 d.setContentType(MetaInfo::TYPE_DEFAULT);
147 d.setFreshnessPeriod(10000);
148
149 d.setContent(Content1, sizeof(Content1));
150
151 Block signatureInfo(Tlv::SignatureInfo);
152 // SignatureType
153 {
Alexander Afanasyev90df0002014-01-03 15:32:43 -0800154 signatureInfo.push_back
155 (nonNegativeIntegerBlock(Tlv::SignatureType, Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800156 }
157 // KeyLocator
158 {
159 KeyLocator keyLocator;
160 keyLocator.setName("/test/key/locator");
161
162 signatureInfo.push_back(keyLocator.wireEncode());
163 }
164 signatureInfo.encode();
165
166 // SignatureValue
167 OBufferStream os;
168 Tlv::writeVarNumber(os, Tlv::SignatureValue);
169
170 using namespace CryptoPP;
171
172 RSASS<PKCS1v15, SHA256>::Signer signer(privateKey_);
173
174 int i = 0;
175 PK_MessageAccumulator *hash = signer.NewSignatureAccumulator(rng_);
176 hash->Update(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
177 hash->Update(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
178 hash->Update(d.getContent(). wire(), d.getContent(). size());
179 hash->Update(signatureInfo. wire(), signatureInfo. size());
180
181 size_t length = signer.MaxSignatureLength();
182 SecByteBlock buf(length);
183 signer.Sign(rng_, hash, buf);
184
185 Tlv::writeVarNumber(os, buf.size());
186 os.write(reinterpret_cast<const char *> (buf.BytePtr()), buf.size());
187
188 ndn::Block signatureValue (Block(os.buf()));
189
190 Signature signature(signatureInfo, signatureValue);
191
192 d.setSignature(signature);
193
194 Block dataBlock;
195 BOOST_REQUIRE_NO_THROW(dataBlock = d.wireEncode());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800196
197 BOOST_REQUIRE_EQUAL_COLLECTIONS(Data1, Data1+sizeof(Data1),
198 dataBlock.begin(), dataBlock.end());
199
200}
201
202BOOST_AUTO_TEST_SUITE_END()