blob: e3708355448b85585069e17dfc125bd658295dc6 [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -08002/**
Alexander Afanasyevc169a812014-05-20 20:37:29 -04003 * Copyright (c) 2013-2014 Regents of the University of California.
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07006 *
Alexander Afanasyevc169a812014-05-20 20:37:29 -04007 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080020 */
21
Alexander Afanasyev09c613f2014-01-29 00:23:58 -080022#include "data.hpp"
23#include "security/key-chain.hpp"
Junxiao Shi482ccc52014-03-31 13:05:24 -070024#include "security/cryptopp.hpp"
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -070025#include "encoding/buffer-stream.hpp"
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080026
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070027#include "boost-test.hpp"
28
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080029using namespace std;
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -080030namespace ndn {
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080031
32BOOST_AUTO_TEST_SUITE(TestData)
33
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -070034BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Data>));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -070035BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Signature>));
36
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080037const uint8_t Content1[] = {0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21};
38
39const uint8_t Data1[] = {
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700400x06, 0xc5, // NDN Data
41 0x07, 0x14, // Name
42 0x08, 0x05,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080043 0x6c, 0x6f, 0x63, 0x61, 0x6c,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070044 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080045 0x6e, 0x64, 0x6e,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070046 0x08, 0x06,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080047 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080048 0x14, 0x04, // MetaInfo
49 0x19, 0x02, // FreshnessPeriod
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070050 0x27, 0x10,
51 0x15, 0x08, // Content
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080052 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080053 0x16, 0x1b, // SignatureInfo
54 0x1b, 0x01, // SignatureType
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070055 0x01,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080056 0x1c, 0x16, // KeyLocator
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070057 0x07, 0x14, // Name
58 0x08, 0x04,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080059 0x74, 0x65, 0x73, 0x74,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070060 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080061 0x6b, 0x65, 0x79,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070062 0x08, 0x07,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080063 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080064 0x17, 0x80, // SignatureValue
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070065 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
66 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
67 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
68 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
69 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
70 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
71 0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
72 0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
73 0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
74 0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080075};
76
77const unsigned char DEFAULT_PRIVATE_KEY_DER[] = {
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070078 0x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,
79 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82,
80 0x02, 0x5a, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e, 0x47, 0x85,
81 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47, 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05,
82 0x3a, 0x24, 0x1e, 0xeb, 0x89, 0x01, 0xbb, 0xe9, 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68,
83 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7, 0x06, 0x90, 0x9c, 0xaa,
84 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3, 0x1b, 0x88,
85 0x9a, 0x97, 0x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82,
86 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d, 0x24, 0xc2, 0x63, 0xf3, 0x97, 0x17,
87 0xeb, 0xfe, 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f,
88 0xb8, 0xf2, 0xf1, 0xc5, 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed,
89 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76, 0x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11,
90 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0, 0x2a, 0xe3, 0x6b, 0x0c, 0x8b, 0x73,
91 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c, 0x5b, 0x43, 0x29, 0xad,
92 0x3a, 0x3b, 0x93, 0xa3, 0x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e, 0x33, 0x3f,
93 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44, 0x00, 0xde, 0x72, 0xed,
94 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2,
95 0x69, 0x1f, 0xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13,
96 0x06, 0x69, 0x06, 0xd8, 0x3f, 0x22, 0x15, 0x75, 0xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66,
97 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2, 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37,
98 0x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88, 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f,
99 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02, 0x41, 0x00, 0xb6, 0x2e, 0xbb, 0xcd, 0x2f, 0x3a,
100 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e, 0x64, 0xa7,
101 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae,
102 0xb0, 0x74, 0xa6, 0x99, 0xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e,
103 0x56, 0xad, 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c, 0xb7, 0x9a, 0x3e, 0x99,
104 0xef, 0xb9, 0x02, 0x41, 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1,
105 0xac, 0xee, 0xcb, 0x41, 0x81, 0xc6, 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21,
106 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96, 0x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8,
107 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6, 0x90, 0xb5, 0xce, 0x1b,
108 0x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a, 0x7f, 0x02,
109 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0, 0x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89,
110 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee, 0x51, 0x57,
111 0xd5, 0x97, 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e,
112 0x88, 0x63, 0xe2, 0x66, 0x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a,
113 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca, 0x78, 0xab, 0x21, 0x02, 0x41, 0x00, 0x8f, 0xae,
114 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24, 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81,
115 0xbc, 0x2c, 0x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d, 0x28, 0xd9, 0x10, 0x1a,
116 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14, 0xbf, 0xc9, 0xff, 0x17, 0xd6, 0x47,
117 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
118 0xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a,
119 0x33, 0x2f, 0x4b, 0xa2, 0xbd, 0xd1, 0xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15,
120 0x37, 0x1b, 0xde, 0x76, 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9, 0x4f, 0x35,
121 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95, 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21,
122 0x6d, 0xa0, 0x84, 0x39, 0xe9, 0x2e, 0x1e, 0xfc, 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d,
123 0x0a, 0xb6
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800124};
125
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700126BOOST_AUTO_TEST_CASE(DataEqualityChecks)
127{
128 using namespace time;
129
130 Data a;
131 Data b;
132 BOOST_CHECK_EQUAL(a == b, true);
133 BOOST_CHECK_EQUAL(a != b, false);
134
135 a.setName("ndn:/A");
136 BOOST_CHECK_EQUAL(a == b, false);
137 BOOST_CHECK_EQUAL(a != b, true);
138
139 b.setName("ndn:/B");
140 BOOST_CHECK_EQUAL(a == b, false);
141 BOOST_CHECK_EQUAL(a != b, true);
142
143 b.setName("ndn:/A");
144 BOOST_CHECK_EQUAL(a == b, true);
145 BOOST_CHECK_EQUAL(a != b, false);
146
147 a.setFreshnessPeriod(seconds(10));
148 BOOST_CHECK_EQUAL(a == b, false);
149 BOOST_CHECK_EQUAL(a != b, true);
150
151 b.setFreshnessPeriod(seconds(10));
152 BOOST_CHECK_EQUAL(a == b, true);
153 BOOST_CHECK_EQUAL(a != b, false);
154
155 static const uint8_t someData[] = "someData";
156 a.setContent(someData, sizeof(someData));
157 BOOST_CHECK_EQUAL(a == b, false);
158 BOOST_CHECK_EQUAL(a != b, true);
159
160 b.setContent(someData, sizeof(someData));
161 BOOST_CHECK_EQUAL(a == b, true);
162 BOOST_CHECK_EQUAL(a != b, false);
163
164 a.setSignature(SignatureSha256WithRsa());
165 BOOST_CHECK_EQUAL(a == b, false);
166 BOOST_CHECK_EQUAL(a != b, true);
167
168 b.setSignature(SignatureSha256WithRsa());
169 BOOST_CHECK_EQUAL(a == b, true);
170 BOOST_CHECK_EQUAL(a != b, false);
171}
172
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700173BOOST_AUTO_TEST_CASE(SignatureEqualityChecks)
174{
175 Signature a;
176 Signature b;
177
178 BOOST_CHECK_EQUAL(a == b, true);
179 BOOST_CHECK_EQUAL(a != b, false);
180
181 a = SignatureSha256WithRsa();
182 BOOST_CHECK_EQUAL(a == b, false);
183 BOOST_CHECK_EQUAL(a != b, true);
184
185 b = SignatureSha256WithRsa();
186 static const uint8_t someData[256] = {};
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600187 Block signatureValue = dataBlock(tlv::SignatureValue, someData, sizeof(someData));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700188 b.setValue(signatureValue);
189 BOOST_CHECK_EQUAL(a == b, false);
190 BOOST_CHECK_EQUAL(a != b, true);
191
192 a.setValue(signatureValue);
193 BOOST_CHECK_EQUAL(a == b, true);
194 BOOST_CHECK_EQUAL(a != b, false);
195
Yingdi Yubf6a2812014-06-17 15:32:11 -0700196 a = DigestSha256();
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700197 b = SignatureSha256WithRsa();
198 BOOST_CHECK_EQUAL(a == b, false);
199 BOOST_CHECK_EQUAL(a != b, true);
200
Yingdi Yubf6a2812014-06-17 15:32:11 -0700201 b = DigestSha256();
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700202 BOOST_CHECK_EQUAL(a == b, true);
203 BOOST_CHECK_EQUAL(a != b, false);
204}
205
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800206class TestDataFixture
207{
208public:
209 TestDataFixture()
210 {
211 CryptoPP::StringSource source(DEFAULT_PRIVATE_KEY_DER, sizeof(DEFAULT_PRIVATE_KEY_DER), true);
212 privateKey_.Load(source);
213 publicKey_ = privateKey_;
214 }
215
216protected:
217 CryptoPP::AutoSeededRandomPool rng_;
218 CryptoPP::RSA::PrivateKey privateKey_;
219 CryptoPP::RSA::PublicKey publicKey_;
220};
221
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700222BOOST_FIXTURE_TEST_CASE(Decode, TestDataFixture)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800223{
224 Block dataBlock(Data1, sizeof(Data1));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700225
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800226 ndn::Data d;
227 // BOOST_REQUIRE_NO_THROW
228 (d.wireDecode(dataBlock));
229
230 BOOST_REQUIRE_EQUAL(d.getName().toUri(), "/local/ndn/prefix");
231 BOOST_REQUIRE_EQUAL(d.getContentType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700232 BOOST_REQUIRE_EQUAL(d.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800233
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700234 BOOST_REQUIRE_EQUAL(std::string(reinterpret_cast<const char*>(d.getContent().value()),
235 d.getContent().value_size()), "SUCCESS!");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800236
Alexander Afanasyev76c51562014-01-03 15:13:48 -0800237 BOOST_REQUIRE_EQUAL(d.getSignature().getType(), static_cast<uint32_t>(Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800238 ndn::Block block = d.getSignature().getInfo();
239 block.parse();
240 KeyLocator keyLocator;
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600241 BOOST_REQUIRE_NO_THROW(keyLocator.wireDecode(block.get(tlv::KeyLocator)));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700242
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800243 BOOST_REQUIRE_EQUAL(keyLocator.getName().toUri(), "/test/key/locator");
244
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700245 using namespace CryptoPP;
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800246 RSASS<PKCS1v15, SHA256>::Verifier verifier(publicKey_);
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700247 bool signatureVerified = verifier.VerifyMessage(d.wireEncode().value(),
248 d.wireEncode().value_size() -
249 d.getSignature().getValue().size(),
250 d.getSignature().getValue().value(),
251 d.getSignature().getValue().value_size());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800252 BOOST_REQUIRE_EQUAL(signatureVerified, true);
253}
254
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700255BOOST_FIXTURE_TEST_CASE(Encode, TestDataFixture)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800256{
257 // manual data packet creation for now
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700258
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800259 ndn::Data d(ndn::Name("/local/ndn/prefix"));
260 d.setContentType(MetaInfo::TYPE_DEFAULT);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700261 d.setFreshnessPeriod(time::seconds(10));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700262
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800263 d.setContent(Content1, sizeof(Content1));
264
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600265 Block signatureInfo(tlv::SignatureInfo);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800266 // SignatureType
267 {
Alexander Afanasyev90df0002014-01-03 15:32:43 -0800268 signatureInfo.push_back
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600269 (nonNegativeIntegerBlock(tlv::SignatureType, Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800270 }
271 // KeyLocator
272 {
273 KeyLocator keyLocator;
274 keyLocator.setName("/test/key/locator");
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700275
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800276 signatureInfo.push_back(keyLocator.wireEncode());
277 }
278 signatureInfo.encode();
279
280 // SignatureValue
281 OBufferStream os;
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600282 tlv::writeVarNumber(os, tlv::SignatureValue);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800283
284 using namespace CryptoPP;
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700285
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800286 RSASS<PKCS1v15, SHA256>::Signer signer(privateKey_);
287
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800288 PK_MessageAccumulator *hash = signer.NewSignatureAccumulator(rng_);
289 hash->Update(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
290 hash->Update(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
291 hash->Update(d.getContent(). wire(), d.getContent(). size());
292 hash->Update(signatureInfo. wire(), signatureInfo. size());
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700293
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800294 size_t length = signer.MaxSignatureLength();
295 SecByteBlock buf(length);
296 signer.Sign(rng_, hash, buf);
297
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600298 tlv::writeVarNumber(os, buf.size());
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700299 os.write(reinterpret_cast<const char *>(buf.BytePtr()), buf.size());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800300
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700301 ndn::Block signatureValue(Block(os.buf()));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700302
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800303 Signature signature(signatureInfo, signatureValue);
304
305 d.setSignature(signature);
306
307 Block dataBlock;
308 BOOST_REQUIRE_NO_THROW(dataBlock = d.wireEncode());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800309
310 BOOST_REQUIRE_EQUAL_COLLECTIONS(Data1, Data1+sizeof(Data1),
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800311 dataBlock.begin(), dataBlock.end());
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700312
313 std::ostringstream strStream;
314 BOOST_CHECK_NO_THROW(strStream << d);
315
316 BOOST_CHECK_EQUAL(strStream.str(),
317 "Name: /local/ndn/prefix\n"
318 "MetaInfo: ContentType: 0, FreshnessPeriod: 10000 milliseconds\n"
319 "Content: (size: 8)\n"
320 "Signature: (type: 1, value_length: 128)\n");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800321}
322
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700323class DataIdentityFixture
324{
325public:
326 DataIdentityFixture()
327 : identity("/TestData")
328 {
329 identity.appendVersion();
330
331 BOOST_REQUIRE_NO_THROW(certName = keyChain.createIdentity(identity));
332 }
333
334 ~DataIdentityFixture()
335 {
336 BOOST_CHECK_NO_THROW(keyChain.deleteIdentity(identity));
337 }
338
339public:
340 KeyChain keyChain;
341 Name identity;
342 Name certName;
343};
344
345BOOST_FIXTURE_TEST_CASE(FullName, DataIdentityFixture)
346{
347 // Encoding pipeline
348
349 ndn::Data d(ndn::Name("/local/ndn/prefix"));
350 d.setContentType(MetaInfo::TYPE_DEFAULT);
351 d.setFreshnessPeriod(time::seconds(10));
352
353 d.setContent(Content1, sizeof(Content1));
354
355 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
356
357 keyChain.sign(d, certName);
358
359 Name fullName;
360 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
361
362 BOOST_CHECK_EQUAL(d.getName().hasWire(), true);
363 BOOST_CHECK_EQUAL(fullName.hasWire(), false);
364
365 // check if name was properly cached
366 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
367
368 // check FullName content
369 BOOST_REQUIRE_EQUAL(d.getName().size() + 1, fullName.size());
370 BOOST_CHECK_EQUAL_COLLECTIONS(d.getName().begin(), d.getName().end(),
371 fullName.begin(), fullName.end() - 1);
372 BOOST_CHECK_EQUAL(fullName.get(-1).value_size(), 32);
373
374 // FullName should be reset after the next line
375 d.setFreshnessPeriod(time::seconds(100));
376 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
377
378 // Decoding pipeline
379 d.wireDecode(Block(Data1, sizeof(Data1)));
380 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
381
382 BOOST_CHECK_EQUAL(fullName.toUri(),
383 "/local/ndn/prefix/"
384 "%28%BA%D4%B5%27%5B%D3%92%DB%B6p%C7%5C%F0%B6o%13%F7%94+%21%E8%0FU%C0%E8k7GS%A5H");
385}
386
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800387BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800388
389} // namespace ndn