blob: 56ca7759a7828d79b32ff1ddeb44293ddc3d94be [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 +000082BOOST_AUTO_TEST_CASE(DefaultConstructor)
83{
84 Data d;
85 BOOST_CHECK_EQUAL(d.hasWire(), false);
86 BOOST_CHECK_EQUAL(d.getName(), "/");
87 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
88 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), DEFAULT_FRESHNESS_PERIOD);
Junxiao Shi7d9039b2018-04-14 15:56:28 +000089 BOOST_CHECK(!d.getFinalBlock());
Junxiao Shi81206d52017-07-23 12:43:22 +000090 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
91 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
92 BOOST_CHECK(!d.getSignature());
93}
94
95class DataSigningKeyFixture
96{
97protected:
98 DataSigningKeyFixture()
99 {
100 m_privKey.loadPkcs1(PRIVATE_KEY_DER, sizeof(PRIVATE_KEY_DER));
101 auto buf = m_privKey.derivePublicKey();
102 m_pubKey.loadPkcs8(buf->data(), buf->size());
103 }
104
105protected:
106 security::transform::PrivateKey m_privKey;
107 security::transform::PublicKey m_pubKey;
108
109private:
110 static const uint8_t PRIVATE_KEY_DER[632];
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800111};
112
Junxiao Shi81206d52017-07-23 12:43:22 +0000113const uint8_t DataSigningKeyFixture::PRIVATE_KEY_DER[] = {
114 0x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
115 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82, 0x02, 0x5a, 0x02, 0x01,
116 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e, 0x47, 0x85, 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47,
117 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05, 0x3a, 0x24, 0x1e, 0xeb, 0x89, 0x01, 0xbb, 0xe9,
118 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68, 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7,
119 0x06, 0x90, 0x9c, 0xaa, 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3,
120 0x1b, 0x88, 0x9a, 0x97, 0x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82,
121 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d, 0x24, 0xc2, 0x63, 0xf3, 0x97, 0x17, 0xeb, 0xfe,
122 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f, 0xb8, 0xf2, 0xf1, 0xc5,
123 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed, 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76,
124 0x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11, 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0,
125 0x2a, 0xe3, 0x6b, 0x0c, 0x8b, 0x73, 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c,
126 0x5b, 0x43, 0x29, 0xad, 0x3a, 0x3b, 0x93, 0xa3, 0x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e,
127 0x33, 0x3f, 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44, 0x00, 0xde, 0x72, 0xed,
128 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2, 0x69, 0x1f,
129 0xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13, 0x06, 0x69, 0x06, 0xd8,
130 0x3f, 0x22, 0x15, 0x75, 0xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66, 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2,
131 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37, 0x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88,
132 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f, 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02, 0x41, 0x00, 0xb6, 0x2e,
133 0xbb, 0xcd, 0x2f, 0x3a, 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e,
134 0x64, 0xa7, 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae,
135 0xb0, 0x74, 0xa6, 0x99, 0xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e, 0x56, 0xad,
136 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c, 0xb7, 0x9a, 0x3e, 0x99, 0xef, 0xb9, 0x02, 0x41,
137 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1, 0xac, 0xee, 0xcb, 0x41, 0x81, 0xc6,
138 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21, 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96,
139 0x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8, 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6,
140 0x90, 0xb5, 0xce, 0x1b, 0x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a,
141 0x7f, 0x02, 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0, 0x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89,
142 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee, 0x51, 0x57, 0xd5, 0x97,
143 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e, 0x88, 0x63, 0xe2, 0x66,
144 0x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a, 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca,
145 0x78, 0xab, 0x21, 0x02, 0x41, 0x00, 0x8f, 0xae, 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24,
146 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81, 0xbc, 0x2c, 0x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d,
147 0x28, 0xd9, 0x10, 0x1a, 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14, 0xbf, 0xc9, 0xff, 0x17,
148 0xd6, 0x47, 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
149 0xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a, 0x33, 0x2f,
150 0x4b, 0xa2, 0xbd, 0xd1, 0xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15, 0x37, 0x1b, 0xde, 0x76,
151 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9, 0x4f, 0x35, 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95,
152 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21, 0x6d, 0xa0, 0x84, 0x39, 0xe9, 0x2e, 0x1e, 0xfc,
153 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d, 0x0a, 0xb6
154};
155
156BOOST_FIXTURE_TEST_CASE(Encode, DataSigningKeyFixture)
157{
158 // manual data packet creation for now
159
160 Data d(Name("/local/ndn/prefix"));
161 d.setContentType(tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500162 d.setFreshnessPeriod(10_s);
Junxiao Shi81206d52017-07-23 12:43:22 +0000163 d.setContent(CONTENT1, sizeof(CONTENT1));
164
165 Block signatureInfo(tlv::SignatureInfo);
166 // SignatureType
167 signatureInfo.push_back(makeNonNegativeIntegerBlock(tlv::SignatureType, tlv::SignatureSha256WithRsa));
168 // KeyLocator
169 {
170 KeyLocator keyLocator;
171 keyLocator.setName("/test/key/locator");
172 signatureInfo.push_back(keyLocator.wireEncode());
173 }
174 signatureInfo.encode();
175
176 // SignatureValue
177 OBufferStream os;
178 tlv::writeVarNumber(os, tlv::SignatureValue);
179
180 OBufferStream sig;
181 {
182 namespace tr = security::transform;
183
184 tr::StepSource input;
185 input >> tr::signerFilter(DigestAlgorithm::SHA256, m_privKey) >> tr::streamSink(sig);
186
187 input.write(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
188 input.write(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
189 input.write(d.getContent(). wire(), d.getContent(). size());
190 input.write(signatureInfo. wire(), signatureInfo. size());
191 input.end();
192 }
193 auto buf = sig.buf();
194 tlv::writeVarNumber(os, buf->size());
Davide Pesavento5d0b0102017-10-07 13:43:16 -0400195 os.write(buf->get<char>(), buf->size());
Junxiao Shi81206d52017-07-23 12:43:22 +0000196
197 Block signatureValue(os.buf());
198 Signature signature(signatureInfo, signatureValue);
199 d.setSignature(signature);
200
201 Block dataBlock(d.wireEncode());
202 BOOST_CHECK_EQUAL_COLLECTIONS(DATA1, DATA1 + sizeof(DATA1),
203 dataBlock.begin(), dataBlock.end());
204}
205
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000206BOOST_FIXTURE_TEST_CASE(Decode02, DataSigningKeyFixture)
Junxiao Shi81206d52017-07-23 12:43:22 +0000207{
208 Block dataBlock(DATA1, sizeof(DATA1));
209 Data d(dataBlock);
210
211 BOOST_CHECK_EQUAL(d.getName().toUri(), "/local/ndn/prefix");
Davide Pesavento869b11e2019-08-18 17:44:27 -0400212 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500213 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 10_s);
Junxiao Shi81206d52017-07-23 12:43:22 +0000214 BOOST_CHECK_EQUAL(std::string(reinterpret_cast<const char*>(d.getContent().value()),
215 d.getContent().value_size()), "SUCCESS!");
216 BOOST_CHECK_EQUAL(d.getSignature().getType(), tlv::SignatureSha256WithRsa);
217
218 Block block = d.getSignature().getInfo();
219 block.parse();
220 KeyLocator keyLocator(block.get(tlv::KeyLocator));
221 BOOST_CHECK_EQUAL(keyLocator.getName().toUri(), "/test/key/locator");
222
223 BOOST_CHECK(security::verifySignature(d, m_pubKey));
224}
225
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000226class Decode03Fixture
227{
228protected:
229 Decode03Fixture()
230 {
231 // initialize all elements to non-empty, to verify wireDecode clears them
232 d.setName("/A");
233 d.setContentType(tlv::ContentType_Key);
234 d.setContent("1504C0C1C2C3"_block);
235 d.setSignature(Signature("160A 1B0101 1C050703080142"_block,
236 "1780 B48F1707A3BCA3CFC5F32DE51D9B46C32D7D262A21544EBDA88C3B415D637503"
237 "FC9BEF20F88202A56AF9831E0D30205FD4154B08502BCDEE860267A5C3E03D8E"
238 "A6CB74BE391C01E0A57B991B4404FC11B7D777F1B700A4B65F201118CF1840A8"
239 "30A2A7C17DB4B7A8777E58515121AF9E2498627F8475414CDFD9801B8152AD5B"_block));
240 }
241
242protected:
243 Data d;
244};
245
246BOOST_FIXTURE_TEST_SUITE(Decode03, Decode03Fixture)
247
248BOOST_AUTO_TEST_CASE(MinimalNoSigValue)
249{
250 d.wireDecode("0607 0700 16031B0100"_block);
251 BOOST_CHECK_EQUAL(d.getName(), "/"); // empty Name is allowed in Data
Davide Pesaventoef654dd2019-07-18 20:02:44 -0400252 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
253 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
254 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000255 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");
Davide Pesaventoef654dd2019-07-18 20:02:44 -0400265 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
266 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
267 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000268 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
269 BOOST_CHECK_EQUAL(d.getSignature().getType(), tlv::DigestSha256);
270 BOOST_CHECK_EQUAL(d.getSignature().getValue().value_size(), 32);
271
272 // encode without modification: retain original wire encoding
273 BOOST_CHECK_EQUAL(d.wireEncode().value_size(), 44);
274
275 // modify then re-encode as v0.2 format
276 d.setName("/E");
Junxiao Shi72c0c642018-04-20 15:41:09 +0000277 BOOST_CHECK_EQUAL(d.wireEncode(),
278 "0630 0703080145 1400 1500 16031B0100 "
279 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000280}
281
282BOOST_AUTO_TEST_CASE(Full)
283{
Junxiao Shi8b753a22018-10-24 01:51:40 +0000284 d.wireDecode("063A 0703080144 FC00 1400 FC00 1500 FC00 16031B0100 FC00 "
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000285 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 FC00"_block);
286 BOOST_CHECK_EQUAL(d.getName(), "/D");
Davide Pesaventoef654dd2019-07-18 20:02:44 -0400287 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
288 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
289 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000290 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
291 BOOST_CHECK_EQUAL(d.getSignature().getType(), tlv::DigestSha256);
292 BOOST_CHECK_EQUAL(d.getSignature().getValue().value_size(), 32);
293
294 // encode without modification: retain original wire encoding
Junxiao Shi8b753a22018-10-24 01:51:40 +0000295 BOOST_CHECK_EQUAL(d.wireEncode().value_size(), 58);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000296
297 // modify then re-encode as v0.2 format
298 d.setName("/E");
Junxiao Shi72c0c642018-04-20 15:41:09 +0000299 BOOST_CHECK_EQUAL(d.wireEncode(),
300 "0630 0703080145 1400 1500 16031B0100 "
301 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000302}
303
304BOOST_AUTO_TEST_CASE(CriticalElementOutOfOrder)
305{
306 BOOST_CHECK_THROW(d.wireDecode(
307 "0630 1400 0703080145 1500 16031B0100 "
308 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
309 tlv::Error);
310 BOOST_CHECK_THROW(d.wireDecode(
311 "0630 0703080145 1500 1400 16031B0100 "
312 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
313 tlv::Error);
314 BOOST_CHECK_THROW(d.wireDecode(
315 "0630 0703080145 1400 16031B0100 1500 "
316 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
317 tlv::Error);
318 BOOST_CHECK_THROW(d.wireDecode(
319 "0630 0703080145 1400 1500 "
320 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 16031B0100"_block),
321 tlv::Error);
322 BOOST_CHECK_THROW(d.wireDecode(
323 "0652 0703080145 1400 1500 16031B0100 "
324 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"
325 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
326 tlv::Error);
327}
328
329BOOST_AUTO_TEST_CASE(NameMissing)
330{
331 BOOST_CHECK_THROW(d.wireDecode("0605 16031B0100"_block), tlv::Error);
332}
333
334BOOST_AUTO_TEST_CASE(SigInfoMissing)
335{
336 BOOST_CHECK_THROW(d.wireDecode("0605 0703080144"_block), tlv::Error);
337}
338
Junxiao Shi8b753a22018-10-24 01:51:40 +0000339BOOST_AUTO_TEST_CASE(UnrecognizedNonCriticalElementBeforeName)
340{
341 BOOST_CHECK_THROW(d.wireDecode(
342 "062F FC00 0703080144 16031B0100 "
343 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
344 tlv::Error);
345}
346
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000347BOOST_AUTO_TEST_CASE(UnrecognizedCriticalElement)
348{
349 BOOST_CHECK_THROW(d.wireDecode(
350 "0632 0703080145 FB00 1400 1500 16031B0100 "
351 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
352 tlv::Error);
353}
354
355BOOST_AUTO_TEST_SUITE_END() // Decode03
356
Junxiao Shi81206d52017-07-23 12:43:22 +0000357BOOST_FIXTURE_TEST_CASE(FullName, IdentityManagementFixture)
358{
359 Data d(Name("/local/ndn/prefix"));
360 d.setContentType(tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500361 d.setFreshnessPeriod(10_s);
Junxiao Shi81206d52017-07-23 12:43:22 +0000362 d.setContent(CONTENT1, sizeof(CONTENT1));
363 BOOST_CHECK_THROW(d.getFullName(), Data::Error); // FullName is unavailable without signing
364
365 m_keyChain.sign(d);
366 BOOST_CHECK_EQUAL(d.hasWire(), true);
367 Name fullName = d.getFullName(); // FullName is available after signing
368
369 BOOST_CHECK_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(), util::Sha256::DIGEST_SIZE);
373
374 // FullName should be cached, so value() pointer points to same memory location
375 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
376
Davide Pesavento0f830802018-01-16 23:58:58 -0500377 d.setFreshnessPeriod(100_s); // invalidates FullName
Junxiao Shi81206d52017-07-23 12:43:22 +0000378 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
379
380 Data d1(Block(DATA1, sizeof(DATA1)));
381 BOOST_CHECK_EQUAL(d1.getFullName(),
382 "/local/ndn/prefix/"
383 "sha256digest=28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548");
384}
385
Junxiao Shi81206d52017-07-23 12:43:22 +0000386BOOST_AUTO_TEST_CASE(Equality)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700387{
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700388 Data a;
389 Data b;
390 BOOST_CHECK_EQUAL(a == b, true);
391 BOOST_CHECK_EQUAL(a != b, false);
392
393 a.setName("ndn:/A");
394 BOOST_CHECK_EQUAL(a == b, false);
395 BOOST_CHECK_EQUAL(a != b, true);
396
397 b.setName("ndn:/B");
398 BOOST_CHECK_EQUAL(a == b, false);
399 BOOST_CHECK_EQUAL(a != b, true);
400
401 b.setName("ndn:/A");
402 BOOST_CHECK_EQUAL(a == b, true);
403 BOOST_CHECK_EQUAL(a != b, false);
404
Davide Pesavento0f830802018-01-16 23:58:58 -0500405 a.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700406 BOOST_CHECK_EQUAL(a == b, false);
407 BOOST_CHECK_EQUAL(a != b, true);
408
Davide Pesavento0f830802018-01-16 23:58:58 -0500409 b.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700410 BOOST_CHECK_EQUAL(a == b, true);
411 BOOST_CHECK_EQUAL(a != b, false);
412
413 static const uint8_t someData[] = "someData";
414 a.setContent(someData, sizeof(someData));
415 BOOST_CHECK_EQUAL(a == b, false);
416 BOOST_CHECK_EQUAL(a != b, true);
417
418 b.setContent(someData, sizeof(someData));
419 BOOST_CHECK_EQUAL(a == b, true);
420 BOOST_CHECK_EQUAL(a != b, false);
421
422 a.setSignature(SignatureSha256WithRsa());
423 BOOST_CHECK_EQUAL(a == b, false);
424 BOOST_CHECK_EQUAL(a != b, true);
425
426 b.setSignature(SignatureSha256WithRsa());
427 BOOST_CHECK_EQUAL(a == b, true);
428 BOOST_CHECK_EQUAL(a != b, false);
429}
430
Junxiao Shi81206d52017-07-23 12:43:22 +0000431BOOST_AUTO_TEST_CASE(Print)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700432{
Junxiao Shi81206d52017-07-23 12:43:22 +0000433 Data d(Block(DATA1, sizeof(DATA1)));
434 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(d),
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700435 "Name: /local/ndn/prefix\n"
436 "MetaInfo: ContentType: 0, FreshnessPeriod: 10000 milliseconds\n"
437 "Content: (size: 8)\n"
Junxiao Shi605671d2017-08-26 13:41:06 +0000438 "Signature: (type: SignatureSha256WithRsa, value_length: 128)\n");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800439}
440
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100441BOOST_AUTO_TEST_SUITE_END() // TestData
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800442
Spyridon Mastorakis429634f2015-02-19 17:35:33 -0800443} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800444} // namespace ndn