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