blob: 9457089905f3b1d4ba7e7f6a7f8abc17a89157e4 [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesaventoc2e12b42017-07-09 20:35:09 -04002/*
Davide Pesavento869b11e2019-08-18 17:44:27 -04003 * Copyright (c) 2013-2019 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
Davide Pesavento7e780642018-11-24 15:51:34 -050022#include "ndn-cxx/data.hpp"
23#include "ndn-cxx/encoding/buffer-stream.hpp"
24#include "ndn-cxx/security/signature-sha256-with-rsa.hpp"
25#include "ndn-cxx/security/transform/private-key.hpp"
26#include "ndn-cxx/security/transform/public-key.hpp"
27#include "ndn-cxx/security/transform/signer-filter.hpp"
28#include "ndn-cxx/security/transform/step-source.hpp"
29#include "ndn-cxx/security/transform/stream-sink.hpp"
30#include "ndn-cxx/security/verification-helpers.hpp"
31#include "ndn-cxx/util/sha256.hpp"
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080032
Davide Pesavento7e780642018-11-24 15:51:34 -050033#include "tests/boost-test.hpp"
34#include "tests/identity-management-fixture.hpp"
Junxiao Shi81206d52017-07-23 12:43:22 +000035#include <boost/lexical_cast.hpp>
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070036
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -080037namespace ndn {
Spyridon Mastorakis429634f2015-02-19 17:35:33 -080038namespace tests {
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080039
40BOOST_AUTO_TEST_SUITE(TestData)
41
Junxiao Shi81206d52017-07-23 12:43:22 +000042const uint8_t CONTENT1[] = {0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21};
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080043
Junxiao Shi81206d52017-07-23 12:43:22 +000044const uint8_t DATA1[] = {
450x06, 0xc5, // Data
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070046 0x07, 0x14, // Name
47 0x08, 0x05,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080048 0x6c, 0x6f, 0x63, 0x61, 0x6c,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070049 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080050 0x6e, 0x64, 0x6e,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070051 0x08, 0x06,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080052 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080053 0x14, 0x04, // MetaInfo
54 0x19, 0x02, // FreshnessPeriod
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070055 0x27, 0x10,
56 0x15, 0x08, // Content
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080057 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080058 0x16, 0x1b, // SignatureInfo
59 0x1b, 0x01, // SignatureType
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070060 0x01,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080061 0x1c, 0x16, // KeyLocator
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070062 0x07, 0x14, // Name
63 0x08, 0x04,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080064 0x74, 0x65, 0x73, 0x74,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070065 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080066 0x6b, 0x65, 0x79,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070067 0x08, 0x07,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080068 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080069 0x17, 0x80, // SignatureValue
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070070 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
71 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
72 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
73 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
74 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
75 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
76 0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
77 0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
78 0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
79 0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080080};
81
Junxiao Shi81206d52017-07-23 12:43:22 +000082// ---- constructor, encode, decode ----
83
84BOOST_AUTO_TEST_CASE(DefaultConstructor)
85{
86 Data d;
87 BOOST_CHECK_EQUAL(d.hasWire(), false);
88 BOOST_CHECK_EQUAL(d.getName(), "/");
89 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
90 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), DEFAULT_FRESHNESS_PERIOD);
Junxiao Shi7d9039b2018-04-14 15:56:28 +000091 BOOST_CHECK(!d.getFinalBlock());
Junxiao Shi81206d52017-07-23 12:43:22 +000092 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
93 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
94 BOOST_CHECK(!d.getSignature());
95}
96
97class DataSigningKeyFixture
98{
99protected:
100 DataSigningKeyFixture()
101 {
102 m_privKey.loadPkcs1(PRIVATE_KEY_DER, sizeof(PRIVATE_KEY_DER));
103 auto buf = m_privKey.derivePublicKey();
104 m_pubKey.loadPkcs8(buf->data(), buf->size());
105 }
106
107protected:
108 security::transform::PrivateKey m_privKey;
109 security::transform::PublicKey m_pubKey;
110
111private:
112 static const uint8_t PRIVATE_KEY_DER[632];
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800113};
114
Junxiao Shi81206d52017-07-23 12:43:22 +0000115const uint8_t DataSigningKeyFixture::PRIVATE_KEY_DER[] = {
116 0x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
117 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82, 0x02, 0x5a, 0x02, 0x01,
118 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e, 0x47, 0x85, 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47,
119 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05, 0x3a, 0x24, 0x1e, 0xeb, 0x89, 0x01, 0xbb, 0xe9,
120 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68, 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7,
121 0x06, 0x90, 0x9c, 0xaa, 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3,
122 0x1b, 0x88, 0x9a, 0x97, 0x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82,
123 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d, 0x24, 0xc2, 0x63, 0xf3, 0x97, 0x17, 0xeb, 0xfe,
124 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f, 0xb8, 0xf2, 0xf1, 0xc5,
125 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed, 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76,
126 0x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11, 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0,
127 0x2a, 0xe3, 0x6b, 0x0c, 0x8b, 0x73, 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c,
128 0x5b, 0x43, 0x29, 0xad, 0x3a, 0x3b, 0x93, 0xa3, 0x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e,
129 0x33, 0x3f, 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44, 0x00, 0xde, 0x72, 0xed,
130 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2, 0x69, 0x1f,
131 0xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13, 0x06, 0x69, 0x06, 0xd8,
132 0x3f, 0x22, 0x15, 0x75, 0xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66, 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2,
133 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37, 0x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88,
134 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f, 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02, 0x41, 0x00, 0xb6, 0x2e,
135 0xbb, 0xcd, 0x2f, 0x3a, 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e,
136 0x64, 0xa7, 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae,
137 0xb0, 0x74, 0xa6, 0x99, 0xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e, 0x56, 0xad,
138 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c, 0xb7, 0x9a, 0x3e, 0x99, 0xef, 0xb9, 0x02, 0x41,
139 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1, 0xac, 0xee, 0xcb, 0x41, 0x81, 0xc6,
140 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21, 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96,
141 0x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8, 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6,
142 0x90, 0xb5, 0xce, 0x1b, 0x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a,
143 0x7f, 0x02, 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0, 0x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89,
144 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee, 0x51, 0x57, 0xd5, 0x97,
145 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e, 0x88, 0x63, 0xe2, 0x66,
146 0x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a, 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca,
147 0x78, 0xab, 0x21, 0x02, 0x41, 0x00, 0x8f, 0xae, 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24,
148 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81, 0xbc, 0x2c, 0x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d,
149 0x28, 0xd9, 0x10, 0x1a, 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14, 0xbf, 0xc9, 0xff, 0x17,
150 0xd6, 0x47, 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
151 0xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a, 0x33, 0x2f,
152 0x4b, 0xa2, 0xbd, 0xd1, 0xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15, 0x37, 0x1b, 0xde, 0x76,
153 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9, 0x4f, 0x35, 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95,
154 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21, 0x6d, 0xa0, 0x84, 0x39, 0xe9, 0x2e, 0x1e, 0xfc,
155 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d, 0x0a, 0xb6
156};
157
158BOOST_FIXTURE_TEST_CASE(Encode, DataSigningKeyFixture)
159{
160 // manual data packet creation for now
161
162 Data d(Name("/local/ndn/prefix"));
163 d.setContentType(tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500164 d.setFreshnessPeriod(10_s);
Junxiao Shi81206d52017-07-23 12:43:22 +0000165 d.setContent(CONTENT1, sizeof(CONTENT1));
166
167 Block signatureInfo(tlv::SignatureInfo);
168 // SignatureType
169 signatureInfo.push_back(makeNonNegativeIntegerBlock(tlv::SignatureType, tlv::SignatureSha256WithRsa));
170 // KeyLocator
171 {
172 KeyLocator keyLocator;
173 keyLocator.setName("/test/key/locator");
174 signatureInfo.push_back(keyLocator.wireEncode());
175 }
176 signatureInfo.encode();
177
178 // SignatureValue
179 OBufferStream os;
180 tlv::writeVarNumber(os, tlv::SignatureValue);
181
182 OBufferStream sig;
183 {
184 namespace tr = security::transform;
185
186 tr::StepSource input;
187 input >> tr::signerFilter(DigestAlgorithm::SHA256, m_privKey) >> tr::streamSink(sig);
188
189 input.write(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
190 input.write(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
191 input.write(d.getContent(). wire(), d.getContent(). size());
192 input.write(signatureInfo. wire(), signatureInfo. size());
193 input.end();
194 }
195 auto buf = sig.buf();
196 tlv::writeVarNumber(os, buf->size());
Davide Pesavento5d0b0102017-10-07 13:43:16 -0400197 os.write(buf->get<char>(), buf->size());
Junxiao Shi81206d52017-07-23 12:43:22 +0000198
199 Block signatureValue(os.buf());
200 Signature signature(signatureInfo, signatureValue);
201 d.setSignature(signature);
202
203 Block dataBlock(d.wireEncode());
204 BOOST_CHECK_EQUAL_COLLECTIONS(DATA1, DATA1 + sizeof(DATA1),
205 dataBlock.begin(), dataBlock.end());
206}
207
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000208BOOST_FIXTURE_TEST_CASE(Decode02, DataSigningKeyFixture)
Junxiao Shi81206d52017-07-23 12:43:22 +0000209{
210 Block dataBlock(DATA1, sizeof(DATA1));
211 Data d(dataBlock);
212
213 BOOST_CHECK_EQUAL(d.getName().toUri(), "/local/ndn/prefix");
Davide Pesavento869b11e2019-08-18 17:44:27 -0400214 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500215 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 10_s);
Junxiao Shi81206d52017-07-23 12:43:22 +0000216 BOOST_CHECK_EQUAL(std::string(reinterpret_cast<const char*>(d.getContent().value()),
217 d.getContent().value_size()), "SUCCESS!");
218 BOOST_CHECK_EQUAL(d.getSignature().getType(), tlv::SignatureSha256WithRsa);
219
220 Block block = d.getSignature().getInfo();
221 block.parse();
222 KeyLocator keyLocator(block.get(tlv::KeyLocator));
223 BOOST_CHECK_EQUAL(keyLocator.getName().toUri(), "/test/key/locator");
224
225 BOOST_CHECK(security::verifySignature(d, m_pubKey));
226}
227
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000228class Decode03Fixture
229{
230protected:
231 Decode03Fixture()
232 {
233 // initialize all elements to non-empty, to verify wireDecode clears them
234 d.setName("/A");
235 d.setContentType(tlv::ContentType_Key);
236 d.setContent("1504C0C1C2C3"_block);
237 d.setSignature(Signature("160A 1B0101 1C050703080142"_block,
238 "1780 B48F1707A3BCA3CFC5F32DE51D9B46C32D7D262A21544EBDA88C3B415D637503"
239 "FC9BEF20F88202A56AF9831E0D30205FD4154B08502BCDEE860267A5C3E03D8E"
240 "A6CB74BE391C01E0A57B991B4404FC11B7D777F1B700A4B65F201118CF1840A8"
241 "30A2A7C17DB4B7A8777E58515121AF9E2498627F8475414CDFD9801B8152AD5B"_block));
242 }
243
244protected:
245 Data d;
246};
247
248BOOST_FIXTURE_TEST_SUITE(Decode03, Decode03Fixture)
249
250BOOST_AUTO_TEST_CASE(MinimalNoSigValue)
251{
252 d.wireDecode("0607 0700 16031B0100"_block);
253 BOOST_CHECK_EQUAL(d.getName(), "/"); // empty Name is allowed in Data
254 BOOST_CHECK_EQUAL(d.getMetaInfo(), MetaInfo());
255 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
256 BOOST_CHECK_EQUAL(d.getSignature().getType(), tlv::DigestSha256);
257 BOOST_CHECK_EQUAL(d.getSignature().getValue().value_size(), 0);
258}
259
260BOOST_AUTO_TEST_CASE(Minimal)
261{
262 d.wireDecode("062C 0703080144 16031B0100 "
263 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
264 BOOST_CHECK_EQUAL(d.getName(), "/D");
265 BOOST_CHECK_EQUAL(d.getMetaInfo(), MetaInfo());
266 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
267 BOOST_CHECK_EQUAL(d.getSignature().getType(), tlv::DigestSha256);
268 BOOST_CHECK_EQUAL(d.getSignature().getValue().value_size(), 32);
269
270 // encode without modification: retain original wire encoding
271 BOOST_CHECK_EQUAL(d.wireEncode().value_size(), 44);
272
273 // modify then re-encode as v0.2 format
274 d.setName("/E");
Junxiao Shi72c0c642018-04-20 15:41:09 +0000275 BOOST_CHECK_EQUAL(d.wireEncode(),
276 "0630 0703080145 1400 1500 16031B0100 "
277 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000278}
279
280BOOST_AUTO_TEST_CASE(Full)
281{
Junxiao Shi8b753a22018-10-24 01:51:40 +0000282 d.wireDecode("063A 0703080144 FC00 1400 FC00 1500 FC00 16031B0100 FC00 "
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000283 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 FC00"_block);
284 BOOST_CHECK_EQUAL(d.getName(), "/D");
285 BOOST_CHECK_EQUAL(d.getMetaInfo(), MetaInfo());
286 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
287 BOOST_CHECK_EQUAL(d.getSignature().getType(), tlv::DigestSha256);
288 BOOST_CHECK_EQUAL(d.getSignature().getValue().value_size(), 32);
289
290 // encode without modification: retain original wire encoding
Junxiao Shi8b753a22018-10-24 01:51:40 +0000291 BOOST_CHECK_EQUAL(d.wireEncode().value_size(), 58);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000292
293 // modify then re-encode as v0.2 format
294 d.setName("/E");
Junxiao Shi72c0c642018-04-20 15:41:09 +0000295 BOOST_CHECK_EQUAL(d.wireEncode(),
296 "0630 0703080145 1400 1500 16031B0100 "
297 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000298}
299
300BOOST_AUTO_TEST_CASE(CriticalElementOutOfOrder)
301{
302 BOOST_CHECK_THROW(d.wireDecode(
303 "0630 1400 0703080145 1500 16031B0100 "
304 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
305 tlv::Error);
306 BOOST_CHECK_THROW(d.wireDecode(
307 "0630 0703080145 1500 1400 16031B0100 "
308 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
309 tlv::Error);
310 BOOST_CHECK_THROW(d.wireDecode(
311 "0630 0703080145 1400 16031B0100 1500 "
312 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
313 tlv::Error);
314 BOOST_CHECK_THROW(d.wireDecode(
315 "0630 0703080145 1400 1500 "
316 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 16031B0100"_block),
317 tlv::Error);
318 BOOST_CHECK_THROW(d.wireDecode(
319 "0652 0703080145 1400 1500 16031B0100 "
320 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"
321 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
322 tlv::Error);
323}
324
325BOOST_AUTO_TEST_CASE(NameMissing)
326{
327 BOOST_CHECK_THROW(d.wireDecode("0605 16031B0100"_block), tlv::Error);
328}
329
330BOOST_AUTO_TEST_CASE(SigInfoMissing)
331{
332 BOOST_CHECK_THROW(d.wireDecode("0605 0703080144"_block), tlv::Error);
333}
334
Junxiao Shi8b753a22018-10-24 01:51:40 +0000335BOOST_AUTO_TEST_CASE(UnrecognizedNonCriticalElementBeforeName)
336{
337 BOOST_CHECK_THROW(d.wireDecode(
338 "062F FC00 0703080144 16031B0100 "
339 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
340 tlv::Error);
341}
342
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000343BOOST_AUTO_TEST_CASE(UnrecognizedCriticalElement)
344{
345 BOOST_CHECK_THROW(d.wireDecode(
346 "0632 0703080145 FB00 1400 1500 16031B0100 "
347 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
348 tlv::Error);
349}
350
351BOOST_AUTO_TEST_SUITE_END() // Decode03
352
Junxiao Shi81206d52017-07-23 12:43:22 +0000353BOOST_FIXTURE_TEST_CASE(FullName, IdentityManagementFixture)
354{
355 Data d(Name("/local/ndn/prefix"));
356 d.setContentType(tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500357 d.setFreshnessPeriod(10_s);
Junxiao Shi81206d52017-07-23 12:43:22 +0000358 d.setContent(CONTENT1, sizeof(CONTENT1));
359 BOOST_CHECK_THROW(d.getFullName(), Data::Error); // FullName is unavailable without signing
360
361 m_keyChain.sign(d);
362 BOOST_CHECK_EQUAL(d.hasWire(), true);
363 Name fullName = d.getFullName(); // FullName is available after signing
364
365 BOOST_CHECK_EQUAL(d.getName().size() + 1, fullName.size());
366 BOOST_CHECK_EQUAL_COLLECTIONS(d.getName().begin(), d.getName().end(),
367 fullName.begin(), fullName.end() - 1);
368 BOOST_CHECK_EQUAL(fullName.get(-1).value_size(), util::Sha256::DIGEST_SIZE);
369
370 // FullName should be cached, so value() pointer points to same memory location
371 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
372
Davide Pesavento0f830802018-01-16 23:58:58 -0500373 d.setFreshnessPeriod(100_s); // invalidates FullName
Junxiao Shi81206d52017-07-23 12:43:22 +0000374 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
375
376 Data d1(Block(DATA1, sizeof(DATA1)));
377 BOOST_CHECK_EQUAL(d1.getFullName(),
378 "/local/ndn/prefix/"
379 "sha256digest=28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548");
380}
381
382// ---- operators ----
383
384BOOST_AUTO_TEST_CASE(Equality)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700385{
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700386 Data a;
387 Data b;
388 BOOST_CHECK_EQUAL(a == b, true);
389 BOOST_CHECK_EQUAL(a != b, false);
390
391 a.setName("ndn:/A");
392 BOOST_CHECK_EQUAL(a == b, false);
393 BOOST_CHECK_EQUAL(a != b, true);
394
395 b.setName("ndn:/B");
396 BOOST_CHECK_EQUAL(a == b, false);
397 BOOST_CHECK_EQUAL(a != b, true);
398
399 b.setName("ndn:/A");
400 BOOST_CHECK_EQUAL(a == b, true);
401 BOOST_CHECK_EQUAL(a != b, false);
402
Davide Pesavento0f830802018-01-16 23:58:58 -0500403 a.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700404 BOOST_CHECK_EQUAL(a == b, false);
405 BOOST_CHECK_EQUAL(a != b, true);
406
Davide Pesavento0f830802018-01-16 23:58:58 -0500407 b.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700408 BOOST_CHECK_EQUAL(a == b, true);
409 BOOST_CHECK_EQUAL(a != b, false);
410
411 static const uint8_t someData[] = "someData";
412 a.setContent(someData, sizeof(someData));
413 BOOST_CHECK_EQUAL(a == b, false);
414 BOOST_CHECK_EQUAL(a != b, true);
415
416 b.setContent(someData, sizeof(someData));
417 BOOST_CHECK_EQUAL(a == b, true);
418 BOOST_CHECK_EQUAL(a != b, false);
419
420 a.setSignature(SignatureSha256WithRsa());
421 BOOST_CHECK_EQUAL(a == b, false);
422 BOOST_CHECK_EQUAL(a != b, true);
423
424 b.setSignature(SignatureSha256WithRsa());
425 BOOST_CHECK_EQUAL(a == b, true);
426 BOOST_CHECK_EQUAL(a != b, false);
427}
428
Junxiao Shi81206d52017-07-23 12:43:22 +0000429BOOST_AUTO_TEST_CASE(Print)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700430{
Junxiao Shi81206d52017-07-23 12:43:22 +0000431 Data d(Block(DATA1, sizeof(DATA1)));
432 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(d),
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700433 "Name: /local/ndn/prefix\n"
434 "MetaInfo: ContentType: 0, FreshnessPeriod: 10000 milliseconds\n"
435 "Content: (size: 8)\n"
Junxiao Shi605671d2017-08-26 13:41:06 +0000436 "Signature: (type: SignatureSha256WithRsa, value_length: 128)\n");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800437}
438
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100439BOOST_AUTO_TEST_SUITE_END() // TestData
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800440
Spyridon Mastorakis429634f2015-02-19 17:35:33 -0800441} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800442} // namespace ndn