blob: 0e13d7585454fffc250ddf25c496e255967a1f8e [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
Alexander Afanasyev09c613f2014-01-29 00:23:58 -08009#include "data.hpp"
10#include "security/key-chain.hpp"
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080011
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;
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -080025namespace ndn {
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080026
27BOOST_AUTO_TEST_SUITE(TestData)
28
29const uint8_t Content1[] = {0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21};
30
31const uint8_t Data1[] = {
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800320x02, 0xc5, // NDN Data
33 0x03, 0x14, // Name
34 0x04, 0x05,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080035 0x6c, 0x6f, 0x63, 0x61, 0x6c,
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080036 0x04, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080037 0x6e, 0x64, 0x6e,
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080038 0x04, 0x06,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080039 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080040 0x10, 0x04, // MetaInfo
41 0x15, 0x02, // FreshnessPeriod
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080042 0x27, 0x10,
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080043 0x11, 0x08, // Content
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080044 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080045 0x12, 0x1b, // SignatureInfo
46 0x16, 0x01, // SignatureType
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080047 0x01,
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080048 0x17, 0x16, // KeyLocator
49 0x03, 0x14, // Name
50 0x04, 0x04,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080051 0x74, 0x65, 0x73, 0x74,
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080052 0x04, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080053 0x6b, 0x65, 0x79,
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080054 0x04, 0x07,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080055 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev636e9f12014-01-07 12:01:03 -080056 0x13, 0x80, // SignatureValue
57 0x31, 0x32, 0xd8, 0x03, 0x9b, 0xc0, 0x7f, 0x0f, 0x97, 0xa8, 0x14, 0xa8, 0xa7, 0x69, 0xc3, 0x0b, 0xca, 0xa1, 0x82, 0x3c, 0xeb, 0xad, 0x5d, 0xb6, 0x06, 0xd9, 0x66, 0x85, 0xc6, 0x7e, 0x99, 0x38, 0xd7, 0x33, 0x9a, 0x5b, 0x48, 0x9c, 0x55, 0x6d, 0xfd, 0x7e, 0x97, 0xe2, 0x2a, 0x75, 0xc8, 0x26, 0x8e, 0x2f, 0xe3, 0xa5, 0xc3, 0xf6, 0xa6, 0xe4, 0xc8, 0x23, 0x55, 0x78, 0xff, 0x0c, 0xb1, 0x8c, 0xc2, 0x45, 0x9a, 0xec, 0x4b, 0x87, 0x2b, 0x3a, 0x8d, 0x4c, 0xc7, 0x6c, 0x92, 0xa3, 0x72, 0x0e, 0xae, 0x2e, 0x13, 0xea, 0x5d, 0x1d, 0xce, 0x63, 0x10, 0x63, 0xb2, 0x19, 0xb7, 0x67, 0xb5, 0x7d, 0xbe, 0xac, 0xaf, 0xe2, 0xed, 0x71, 0xc1, 0x47, 0x10, 0x65, 0x7c, 0x69, 0x77, 0xe7, 0xf6, 0x69, 0xd6, 0x12, 0x2b, 0x97, 0x05, 0xe1, 0x71, 0xc0, 0xae, 0xc7, 0xe1, 0x8f, 0x99, 0x32, 0x4f, 0xd7
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080058};
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),
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800198 dataBlock.begin(), dataBlock.end());
199
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800200
201}
202
203BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800204
205} // namespace ndn