blob: 5162f4df158c95dd5307f8525b755cecdba87c7a [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 Pesavento05ec0be2023-03-14 21:18:06 -04003 * Copyright (c) 2013-2023 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"
Davide Pesavento7e780642018-11-24 15:51:34 -050024#include "ndn-cxx/security/transform/private-key.hpp"
25#include "ndn-cxx/security/transform/public-key.hpp"
26#include "ndn-cxx/security/transform/signer-filter.hpp"
27#include "ndn-cxx/security/transform/step-source.hpp"
28#include "ndn-cxx/security/transform/stream-sink.hpp"
Davide Pesavento7e780642018-11-24 15:51:34 -050029#include "ndn-cxx/util/sha256.hpp"
Davide Pesavento14c56cd2020-05-21 01:44:03 -040030#include "ndn-cxx/util/string-helper.hpp"
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080031
Davide Pesavento7e780642018-11-24 15:51:34 -050032#include "tests/boost-test.hpp"
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -050033#include "tests/key-chain-fixture.hpp"
Davide Pesavento14c56cd2020-05-21 01:44:03 -040034
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[] = {
Davide Pesavento14c56cd2020-05-21 01:44:03 -040045 0x06, 0xc5, // Data
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070046 0x07, 0x14, // Name
Davide Pesavento14c56cd2020-05-21 01:44:03 -040047 0x08, 0x05,
48 0x6c, 0x6f, 0x63, 0x61, 0x6c,
49 0x08, 0x03,
50 0x6e, 0x64, 0x6e,
51 0x08, 0x06,
52 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080053 0x14, 0x04, // MetaInfo
Davide Pesavento14c56cd2020-05-21 01:44:03 -040054 0x19, 0x02, // FreshnessPeriod
55 0x27, 0x10,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070056 0x15, 0x08, // Content
Davide Pesavento14c56cd2020-05-21 01:44:03 -040057 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080058 0x16, 0x1b, // SignatureInfo
Davide Pesavento14c56cd2020-05-21 01:44:03 -040059 0x1b, 0x01, // SignatureType
60 0x01,
61 0x1c, 0x16, // KeyLocator
62 0x07, 0x14, // Name
63 0x08, 0x04,
64 0x74, 0x65, 0x73, 0x74,
65 0x08, 0x03,
66 0x6b, 0x65, 0x79,
67 0x08, 0x07,
68 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080069 0x17, 0x80, // SignatureValue
Davide Pesavento14c56cd2020-05-21 01:44:03 -040070 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31,
71 0xec, 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9,
72 0xb3, 0xc6, 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8,
73 0xb3, 0x6a, 0x38, 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6,
74 0x4d, 0x10, 0x1d, 0xdc, 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96,
75 0x5e, 0xc0, 0x62, 0x0b, 0xcf, 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41,
76 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9, 0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d,
77 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8, 0x55, 0xf6, 0x1c, 0x19, 0x0b,
78 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7, 0xaa, 0x0d, 0x14, 0x58,
79 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3, 0xfc, 0x90, 0x7a,
80 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080081};
82
Junxiao Shi81206d52017-07-23 12:43:22 +000083BOOST_AUTO_TEST_CASE(DefaultConstructor)
84{
85 Data d;
86 BOOST_CHECK_EQUAL(d.hasWire(), false);
87 BOOST_CHECK_EQUAL(d.getName(), "/");
88 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
89 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), DEFAULT_FRESHNESS_PERIOD);
Junxiao Shi7d9039b2018-04-14 15:56:28 +000090 BOOST_CHECK(!d.getFinalBlock());
Davide Pesavento81bd6962020-06-17 16:03:23 -040091 BOOST_CHECK_EQUAL(d.hasContent(), false);
92 BOOST_CHECK_EQUAL(d.getContent().isValid(), false);
Junxiao Shi81206d52017-07-23 12:43:22 +000093 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Eric Newberrya3c8bd12020-05-15 17:27:07 -070094 BOOST_CHECK(!d.getSignatureInfo());
Davide Pesavento14c56cd2020-05-21 01:44:03 -040095 BOOST_CHECK_EQUAL(d.getSignatureType(), -1);
96 BOOST_CHECK(!d.getKeyLocator());
97 BOOST_CHECK_EQUAL(d.getSignatureValue().isValid(), false);
Junxiao Shi81206d52017-07-23 12:43:22 +000098}
99
100class DataSigningKeyFixture
101{
102protected:
103 DataSigningKeyFixture()
104 {
Davide Pesavento765abc92021-12-27 00:44:04 -0500105 m_privKey.loadPkcs1(PRIVATE_KEY_DER);
Junxiao Shi81206d52017-07-23 12:43:22 +0000106 auto buf = m_privKey.derivePublicKey();
Davide Pesavento765abc92021-12-27 00:44:04 -0500107 m_pubKey.loadPkcs8(*buf);
Junxiao Shi81206d52017-07-23 12:43:22 +0000108 }
109
110protected:
111 security::transform::PrivateKey m_privKey;
112 security::transform::PublicKey m_pubKey;
113
114private:
Davide Pesavento05ec0be2023-03-14 21:18:06 -0400115 static constexpr uint8_t 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 };
Junxiao Shi81206d52017-07-23 12:43:22 +0000157};
158
Davide Pesavento905d40f2020-06-09 21:33:25 -0400159BOOST_AUTO_TEST_SUITE(Encode)
160
161BOOST_AUTO_TEST_CASE(NotSigned)
Junxiao Shi81206d52017-07-23 12:43:22 +0000162{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400163 Data d;
164 BOOST_CHECK_EXCEPTION(d.wireEncode(), tlv::Error, [] (const auto& e) {
165 return e.what() == "Requested wire format, but Data has not been signed"s;
166 });
167}
168
169BOOST_AUTO_TEST_CASE(Minimal)
170{
171 Data d;
172 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
173 d.setSignatureValue(std::make_shared<Buffer>());
Davide Pesavento81bd6962020-06-17 16:03:23 -0400174 BOOST_CHECK_EQUAL(d.wireEncode(), "060B 0700 1400 16031B0100 1700"_block);
Davide Pesavento905d40f2020-06-09 21:33:25 -0400175}
176
177BOOST_FIXTURE_TEST_CASE(Full, DataSigningKeyFixture)
178{
179 Data d("/local/ndn/prefix");
Junxiao Shi81206d52017-07-23 12:43:22 +0000180 d.setContentType(tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500181 d.setFreshnessPeriod(10_s);
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500182 d.setContent(CONTENT1);
Junxiao Shi81206d52017-07-23 12:43:22 +0000183
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400184 SignatureInfo signatureInfo;
185 signatureInfo.setSignatureType(tlv::SignatureSha256WithRsa);
186 signatureInfo.setKeyLocator(Name("/test/key/locator"));
187 d.setSignatureInfo(signatureInfo);
Junxiao Shi81206d52017-07-23 12:43:22 +0000188
189 OBufferStream sig;
190 {
191 namespace tr = security::transform;
192
193 tr::StepSource input;
194 input >> tr::signerFilter(DigestAlgorithm::SHA256, m_privKey) >> tr::streamSink(sig);
195
Davide Pesavento258d51a2022-02-27 21:26:28 -0500196 input.write(d.getName().wireEncode());
197 input.write(d.getMetaInfo().wireEncode());
198 input.write(d.getContent());
199 input.write(signatureInfo.wireEncode());
Junxiao Shi81206d52017-07-23 12:43:22 +0000200 input.end();
201 }
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400202 d.setSignatureValue(sig.buf());
Junxiao Shi81206d52017-07-23 12:43:22 +0000203
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500204 BOOST_TEST(d.wireEncode() == DATA1, boost::test_tools::per_element());
Junxiao Shi81206d52017-07-23 12:43:22 +0000205}
206
Davide Pesavento905d40f2020-06-09 21:33:25 -0400207BOOST_AUTO_TEST_SUITE_END() // Encode
Junxiao Shi81206d52017-07-23 12:43:22 +0000208
Davide Pesavento905d40f2020-06-09 21:33:25 -0400209class DecodeFixture
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000210{
211protected:
Davide Pesavento905d40f2020-06-09 21:33:25 -0400212 DecodeFixture()
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000213 {
214 // initialize all elements to non-empty, to verify wireDecode clears them
215 d.setName("/A");
216 d.setContentType(tlv::ContentType_Key);
Davide Pesavento905d40f2020-06-09 21:33:25 -0400217 d.setFreshnessPeriod(123_s);
218 d.setFinalBlock(name::Component::fromNumber(42));
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000219 d.setContent("1504C0C1C2C3"_block);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700220 d.setSignatureInfo(SignatureInfo("160A 1B0101 1C050703080142"_block));
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400221 d.setSignatureValue(fromHex("B48F1707A3BCA3CFC5F32DE51D9B46C32D7D262A21544EBDA88C3B415D637503"
222 "FC9BEF20F88202A56AF9831E0D30205FD4154B08502BCDEE860267A5C3E03D8E"
223 "A6CB74BE391C01E0A57B991B4404FC11B7D777F1B700A4B65F201118CF1840A8"
224 "30A2A7C17DB4B7A8777E58515121AF9E2498627F8475414CDFD9801B8152AD5B"));
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000225 }
226
227protected:
228 Data d;
229};
230
Davide Pesavento905d40f2020-06-09 21:33:25 -0400231BOOST_FIXTURE_TEST_SUITE(Decode, DecodeFixture)
232
233BOOST_AUTO_TEST_CASE(NotData)
234{
235 BOOST_CHECK_EXCEPTION(d.wireDecode("4202CAFE"_block), tlv::Error, [] (const auto& e) {
236 return e.what() == "Expecting Data element, but TLV has type 66"s;
237 });
238}
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000239
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000240BOOST_AUTO_TEST_CASE(Minimal)
241{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400242 d.wireDecode("062C 0703(080144) 1603(1B0100) "
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000243 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
244 BOOST_CHECK_EQUAL(d.getName(), "/D");
Davide Pesaventoef654dd2019-07-18 20:02:44 -0400245 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
246 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
247 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400248 BOOST_CHECK_EQUAL(d.hasContent(), false);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000249 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400250 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::DigestSha256);
251 BOOST_CHECK_EQUAL(d.getKeyLocator().has_value(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700252 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 32);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000253
254 // encode without modification: retain original wire encoding
Davide Pesavento905d40f2020-06-09 21:33:25 -0400255 BOOST_CHECK_EQUAL(d.hasWire(), true);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000256 BOOST_CHECK_EQUAL(d.wireEncode().value_size(), 44);
257
Davide Pesavento905d40f2020-06-09 21:33:25 -0400258 // modify then re-encode
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000259 d.setName("/E");
Davide Pesavento905d40f2020-06-09 21:33:25 -0400260 BOOST_CHECK_EQUAL(d.hasWire(), false);
Junxiao Shi72c0c642018-04-20 15:41:09 +0000261 BOOST_CHECK_EQUAL(d.wireEncode(),
Davide Pesavento81bd6962020-06-17 16:03:23 -0400262 "062E 0703(080145) 1400 1603(1B0100) "
Davide Pesavento905d40f2020-06-09 21:33:25 -0400263 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000264}
265
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700266BOOST_AUTO_TEST_CASE(MinimalEmptyName)
267{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400268 d.wireDecode("0609 0700 1603(1B0100) 1700"_block);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700269 BOOST_CHECK_EQUAL(d.getName(), "/"); // empty Name is allowed in Data
270 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
271 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
272 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400273 BOOST_CHECK_EQUAL(d.hasContent(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700274 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400275 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::DigestSha256);
276 BOOST_CHECK_EQUAL(d.getKeyLocator().has_value(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700277 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 0);
278}
279
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000280BOOST_AUTO_TEST_CASE(Full)
281{
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500282 d.wireDecode(Block(DATA1));
Davide Pesavento905d40f2020-06-09 21:33:25 -0400283 BOOST_CHECK_EQUAL(d.getName(), "/local/ndn/prefix");
284 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
285 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 10_s);
286 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400287 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento258d51a2022-02-27 21:26:28 -0500288 BOOST_CHECK_EQUAL(readString(d.getContent()), "SUCCESS!");
Davide Pesavento905d40f2020-06-09 21:33:25 -0400289 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::SignatureSha256WithRsa);
290 BOOST_REQUIRE(d.getKeyLocator().has_value());
291 BOOST_CHECK_EQUAL(d.getKeyLocator()->getName(), "/test/key/locator");
292 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 128);
293}
294
295BOOST_AUTO_TEST_CASE(UnrecognizedNonCriticalElements)
296{
297 d.wireDecode("063A 0703(080144) FC00 1400 FC00 1500 FC00 1603(1B0100) FC00 "
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000298 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 FC00"_block);
299 BOOST_CHECK_EQUAL(d.getName(), "/D");
Davide Pesaventoef654dd2019-07-18 20:02:44 -0400300 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
301 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
302 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400303 BOOST_CHECK_EQUAL(d.hasContent(), true);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000304 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400305 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::DigestSha256);
306 BOOST_CHECK_EQUAL(d.getKeyLocator().has_value(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700307 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 32);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000308
309 // encode without modification: retain original wire encoding
Davide Pesavento905d40f2020-06-09 21:33:25 -0400310 BOOST_CHECK_EQUAL(d.hasWire(), true);
Junxiao Shi8b753a22018-10-24 01:51:40 +0000311 BOOST_CHECK_EQUAL(d.wireEncode().value_size(), 58);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000312
Davide Pesavento905d40f2020-06-09 21:33:25 -0400313 // modify then re-encode
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000314 d.setName("/E");
Davide Pesavento905d40f2020-06-09 21:33:25 -0400315 BOOST_CHECK_EQUAL(d.hasWire(), false);
Junxiao Shi72c0c642018-04-20 15:41:09 +0000316 BOOST_CHECK_EQUAL(d.wireEncode(),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400317 "0630 0703080145 1400 1500 16031B0100 "
318 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000319}
320
321BOOST_AUTO_TEST_CASE(CriticalElementOutOfOrder)
322{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400323 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000324 "0630 1400 0703080145 1500 16031B0100 "
325 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400326 tlv::Error,
327 [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
328 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000329 "0630 0703080145 1500 1400 16031B0100 "
330 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400331 tlv::Error,
332 [] (const auto& e) { return e.what() == "MetaInfo element is out of order"s; });
333 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000334 "0630 0703080145 1400 16031B0100 1500 "
335 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400336 tlv::Error,
337 [] (const auto& e) { return e.what() == "Content element is out of order"s; });
338 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000339 "0630 0703080145 1400 1500 "
340 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 16031B0100"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400341 tlv::Error,
342 [] (const auto& e) { return e.what() == "SignatureInfo element is out of order"s; });
343 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000344 "0652 0703080145 1400 1500 16031B0100 "
345 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"
346 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400347 tlv::Error,
348 [] (const auto& e) { return e.what() == "SignatureValue element is out of order"s; });
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000349}
350
Davide Pesavento905d40f2020-06-09 21:33:25 -0400351BOOST_AUTO_TEST_CASE(MissingName)
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000352{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400353 BOOST_CHECK_EXCEPTION(d.wireDecode("0607 16031B0100 1700"_block), tlv::Error,
354 [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000355}
356
Davide Pesavento905d40f2020-06-09 21:33:25 -0400357BOOST_AUTO_TEST_CASE(MissingSignatureInfo)
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000358{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400359 BOOST_CHECK_EXCEPTION(d.wireDecode("0607 0703080144 1700"_block), tlv::Error,
360 [] (const auto& e) { return e.what() == "SignatureInfo element is missing"s; });
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700361}
362
Davide Pesavento905d40f2020-06-09 21:33:25 -0400363BOOST_AUTO_TEST_CASE(MissingSignatureValue)
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700364{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400365 BOOST_CHECK_EXCEPTION(d.wireDecode("0607 0700 16031B0100"_block), tlv::Error,
366 [] (const auto& e) { return e.what() == "SignatureValue element is missing"s; });
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000367}
368
Junxiao Shi8b753a22018-10-24 01:51:40 +0000369BOOST_AUTO_TEST_CASE(UnrecognizedNonCriticalElementBeforeName)
370{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400371 BOOST_CHECK_EXCEPTION(d.wireDecode(
372 "062E FC00 0703080144 16031B0100 "
373 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
374 tlv::Error,
375 [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
Junxiao Shi8b753a22018-10-24 01:51:40 +0000376}
377
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000378BOOST_AUTO_TEST_CASE(UnrecognizedCriticalElement)
379{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400380 BOOST_CHECK_EXCEPTION(d.wireDecode(
381 "0632 0703080145 FB00 1400 1500 16031B0100 "
382 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
383 tlv::Error,
384 [] (const auto& e) { return e.what() == "Unrecognized element of critical type 251"s; });
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000385}
386
Davide Pesavento905d40f2020-06-09 21:33:25 -0400387BOOST_AUTO_TEST_SUITE_END() // Decode
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000388
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -0500389BOOST_FIXTURE_TEST_CASE(FullName, KeyChainFixture)
Junxiao Shi81206d52017-07-23 12:43:22 +0000390{
391 Data d(Name("/local/ndn/prefix"));
392 d.setContentType(tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500393 d.setFreshnessPeriod(10_s);
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500394 d.setContent(CONTENT1);
Junxiao Shi81206d52017-07-23 12:43:22 +0000395 BOOST_CHECK_THROW(d.getFullName(), Data::Error); // FullName is unavailable without signing
396
397 m_keyChain.sign(d);
398 BOOST_CHECK_EQUAL(d.hasWire(), true);
399 Name fullName = d.getFullName(); // FullName is available after signing
400
401 BOOST_CHECK_EQUAL(d.getName().size() + 1, fullName.size());
402 BOOST_CHECK_EQUAL_COLLECTIONS(d.getName().begin(), d.getName().end(),
403 fullName.begin(), fullName.end() - 1);
404 BOOST_CHECK_EQUAL(fullName.get(-1).value_size(), util::Sha256::DIGEST_SIZE);
405
406 // FullName should be cached, so value() pointer points to same memory location
407 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
408
Davide Pesavento0f830802018-01-16 23:58:58 -0500409 d.setFreshnessPeriod(100_s); // invalidates FullName
Junxiao Shi81206d52017-07-23 12:43:22 +0000410 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
411
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500412 Data d1(Block{DATA1});
Junxiao Shi81206d52017-07-23 12:43:22 +0000413 BOOST_CHECK_EQUAL(d1.getFullName(),
414 "/local/ndn/prefix/"
415 "sha256digest=28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548");
416}
417
Davide Pesavento905d40f2020-06-09 21:33:25 -0400418BOOST_AUTO_TEST_CASE(SetName)
419{
420 Data d;
421 d.setName("/first");
422 BOOST_CHECK_EQUAL(d.getName(), "/first");
423 BOOST_CHECK_EQUAL(d.hasWire(), false);
424
425 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
426 d.setSignatureValue(std::make_shared<Buffer>());
427 d.wireEncode();
428 BOOST_CHECK_EQUAL(d.hasWire(), true);
429 d.setName("/first");
430 BOOST_CHECK_EQUAL(d.getName(), "/first");
431 BOOST_CHECK_EQUAL(d.hasWire(), true);
432
433 d.setName("/second");
434 BOOST_CHECK_EQUAL(d.getName(), "/second");
435 BOOST_CHECK_EQUAL(d.hasWire(), false);
436}
437
438BOOST_AUTO_TEST_CASE(SetContentType)
439{
440 Data d;
441 d.setContentType(tlv::ContentType_Key);
442 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Key);
443 BOOST_CHECK_EQUAL(d.hasWire(), false);
444
445 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
446 d.setSignatureValue(std::make_shared<Buffer>());
447 d.wireEncode();
448 BOOST_CHECK_EQUAL(d.hasWire(), true);
449 d.setContentType(tlv::ContentType_Key);
450 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Key);
451 BOOST_CHECK_EQUAL(d.hasWire(), true);
452
453 d.setContentType(tlv::ContentType_PrefixAnn);
454 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_PrefixAnn);
455 BOOST_CHECK_EQUAL(d.hasWire(), false);
456}
457
458BOOST_AUTO_TEST_CASE(SetFreshnessPeriod)
459{
460 Data d;
461 d.setFreshnessPeriod(15_min);
462 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 15_min);
463 BOOST_CHECK_EQUAL(d.hasWire(), false);
464
465 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
466 d.setSignatureValue(std::make_shared<Buffer>());
467 d.wireEncode();
468 BOOST_CHECK_EQUAL(d.hasWire(), true);
469 d.setFreshnessPeriod(15_min);
470 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 15_min);
471 BOOST_CHECK_EQUAL(d.hasWire(), true);
472
473 d.setFreshnessPeriod(1_h);
474 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 1_h);
475 BOOST_CHECK_EQUAL(d.hasWire(), false);
476}
477
478BOOST_AUTO_TEST_CASE(SetFinalBlock)
479{
480 Data d;
481 d.setFinalBlock(name::Component("foo"));
482 BOOST_CHECK(d.getFinalBlock() == name::Component("foo"));
483 BOOST_CHECK_EQUAL(d.hasWire(), false);
484
485 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
486 d.setSignatureValue(std::make_shared<Buffer>());
487 d.wireEncode();
488 BOOST_CHECK_EQUAL(d.hasWire(), true);
489 d.setFinalBlock(name::Component("foo"));
490 BOOST_CHECK(d.getFinalBlock() == name::Component("foo"));
491 BOOST_CHECK_EQUAL(d.hasWire(), true);
492
493 d.setFinalBlock(name::Component("bar"));
494 BOOST_CHECK(d.getFinalBlock() == name::Component("bar"));
495 BOOST_CHECK_EQUAL(d.hasWire(), false);
496}
497
498BOOST_AUTO_TEST_CASE(SetContent)
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400499{
500 Data d;
Davide Pesavento81bd6962020-06-17 16:03:23 -0400501 BOOST_CHECK_EQUAL(d.hasContent(), false);
502 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Invalid);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400503 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
504
Davide Pesavento81bd6962020-06-17 16:03:23 -0400505 // Block overload, used directly as Content
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400506 const uint8_t direct[] = {0xca, 0xfe};
Davide Pesavento81bd6962020-06-17 16:03:23 -0400507 d.setContent("1502CAFE"_block);
508 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400509 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400510 BOOST_TEST(d.getContent().value_bytes() == direct, boost::test_tools::per_element());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400511
Davide Pesavento81bd6962020-06-17 16:03:23 -0400512 // Block overload, nested inside Content element
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400513 const uint8_t nested[] = {0x99, 0x02, 0xca, 0xfe};
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500514 d.setContent(Block(nested));
Davide Pesavento81bd6962020-06-17 16:03:23 -0400515 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400516 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400517 BOOST_TEST(d.getContent().value_bytes() == nested, boost::test_tools::per_element());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400518
Davide Pesavento81bd6962020-06-17 16:03:23 -0400519 // Block overload, default constructed (invalid)
520 BOOST_CHECK_THROW(d.setContent(Block{}), std::invalid_argument);
521
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500522 // span overload
523 d.setContent(nested);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400524 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400525 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400526 BOOST_TEST(d.getContent().value_bytes() == nested, boost::test_tools::per_element());
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500527 d.setContent(span<uint8_t>{});
Davide Pesavento81bd6962020-06-17 16:03:23 -0400528 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400529 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
530 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500531
Davide Pesavento81bd6962020-06-17 16:03:23 -0400532 // ConstBufferPtr overload
533 d.setContent(std::make_shared<Buffer>(direct, sizeof(direct)));
534 BOOST_CHECK_EQUAL(d.hasContent(), true);
535 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400536 BOOST_TEST(d.getContent().value_bytes() == direct, boost::test_tools::per_element());
Davide Pesavento81bd6962020-06-17 16:03:23 -0400537 d.setContent(std::make_shared<Buffer>());
538 BOOST_CHECK_EQUAL(d.hasContent(), true);
539 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
540 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400541 BOOST_CHECK_THROW(d.setContent(nullptr), std::invalid_argument);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400542
543 // unset
544 d.unsetContent();
545 BOOST_CHECK_EQUAL(d.hasContent(), false);
546 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Invalid);
547 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400548}
549
Davide Pesavento905d40f2020-06-09 21:33:25 -0400550BOOST_AUTO_TEST_CASE(SetSignatureValue)
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400551{
552 Data d;
553 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::Invalid);
554
Davide Pesavento487e3d32022-05-05 18:06:23 -0400555 // span overload
556 const uint8_t sv1[] = {0xbe, 0xef};
557 d.setSignatureValue(sv1);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400558 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::SignatureValue);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400559 BOOST_TEST(d.getSignatureValue().value_bytes() == sv1, boost::test_tools::per_element());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400560
Davide Pesavento487e3d32022-05-05 18:06:23 -0400561 // ConstBufferPtr overload
562 const uint8_t sv2[] = {0xfa, 0xca, 0xde};
563 d.setSignatureValue(std::make_shared<Buffer>(sv2, sizeof(sv2)));
564 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::SignatureValue);
565 BOOST_TEST(d.getSignatureValue().value_bytes() == sv2, boost::test_tools::per_element());
566 d.setSignatureValue(std::make_shared<Buffer>());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400567 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::SignatureValue);
568 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 0);
569
570 BOOST_CHECK_THROW(d.setSignatureValue(nullptr), std::invalid_argument);
571}
572
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -0500573BOOST_FIXTURE_TEST_CASE(ExtractSignedRanges, KeyChainFixture)
Eric Newberrye36aae12020-08-31 22:23:13 -0700574{
575 Data d1("/test/prefix");
576 m_keyChain.sign(d1);
577 auto ranges1 = d1.extractSignedRanges();
578 BOOST_REQUIRE_EQUAL(ranges1.size(), 1);
579 const Block& wire1 = d1.wireEncode();
580 const auto& sigInfoWire1 = wire1.find(tlv::SignatureInfo);
581 BOOST_REQUIRE(sigInfoWire1 != wire1.elements_end());
Davide Pesavento765abc92021-12-27 00:44:04 -0500582 BOOST_CHECK_EQUAL_COLLECTIONS(ranges1.front().begin(), ranges1.front().end(),
Eric Newberrye36aae12020-08-31 22:23:13 -0700583 wire1.value_begin(), sigInfoWire1->value_end());
584
585 // Test with decoded Data and ensure excludes elements after SignatureValue
586 const uint8_t WIRE[] = {
587 0x06, 0x0B, // Data
588 0x07, 0x00, // Name
589 0x16, 0x03, // SignatureInfo
590 0x1B, 0x01, // SignatureType
591 0x00,
592 0x17, 0x00, // SignatureValue
593 0xAA, 0x00 // Unrecognized non-critical element
594 };
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500595 Data d2(Block{WIRE});
Eric Newberrye36aae12020-08-31 22:23:13 -0700596 auto ranges2 = d2.extractSignedRanges();
597 BOOST_REQUIRE_EQUAL(ranges2.size(), 1);
Davide Pesavento765abc92021-12-27 00:44:04 -0500598 BOOST_CHECK_EQUAL_COLLECTIONS(ranges2.front().begin(), ranges2.front().end(), &WIRE[2], &WIRE[9]);
Eric Newberrye36aae12020-08-31 22:23:13 -0700599}
600
Junxiao Shi81206d52017-07-23 12:43:22 +0000601BOOST_AUTO_TEST_CASE(Equality)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700602{
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700603 Data a;
604 Data b;
605 BOOST_CHECK_EQUAL(a == b, true);
606 BOOST_CHECK_EQUAL(a != b, false);
607
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400608 a.setName("/A");
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700609 BOOST_CHECK_EQUAL(a == b, false);
610 BOOST_CHECK_EQUAL(a != b, true);
611
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400612 b.setName("/B");
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700613 BOOST_CHECK_EQUAL(a == b, false);
614 BOOST_CHECK_EQUAL(a != b, true);
615
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400616 b.setName("/A");
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700617 BOOST_CHECK_EQUAL(a == b, true);
618 BOOST_CHECK_EQUAL(a != b, false);
619
Davide Pesavento0f830802018-01-16 23:58:58 -0500620 a.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700621 BOOST_CHECK_EQUAL(a == b, false);
622 BOOST_CHECK_EQUAL(a != b, true);
623
Davide Pesavento0f830802018-01-16 23:58:58 -0500624 b.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700625 BOOST_CHECK_EQUAL(a == b, true);
626 BOOST_CHECK_EQUAL(a != b, false);
627
628 static const uint8_t someData[] = "someData";
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500629 a.setContent(someData);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700630 BOOST_CHECK_EQUAL(a == b, false);
631 BOOST_CHECK_EQUAL(a != b, true);
632
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500633 b.setContent(someData);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700634 BOOST_CHECK_EQUAL(a == b, true);
635 BOOST_CHECK_EQUAL(a != b, false);
636
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700637 a.setSignatureInfo(SignatureInfo(tlv::SignatureSha256WithRsa));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700638 BOOST_CHECK_EQUAL(a == b, false);
639 BOOST_CHECK_EQUAL(a != b, true);
640
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700641 b.setSignatureInfo(SignatureInfo(tlv::SignatureSha256WithRsa));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700642 BOOST_CHECK_EQUAL(a == b, true);
643 BOOST_CHECK_EQUAL(a != b, false);
644}
645
Junxiao Shi81206d52017-07-23 12:43:22 +0000646BOOST_AUTO_TEST_CASE(Print)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700647{
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500648 Data d1(Block{DATA1});
Davide Pesavento81bd6962020-06-17 16:03:23 -0400649 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(d1),
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700650 "Name: /local/ndn/prefix\n"
Davide Pesavento81bd6962020-06-17 16:03:23 -0400651 "MetaInfo: [ContentType: 0, FreshnessPeriod: 10000 milliseconds]\n"
652 "Content: [8 bytes]\n"
653 "Signature: [type: SignatureSha256WithRsa, length: 128]\n");
654
655 Data d2("/foo");
656 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(d2),
657 "Name: /foo\n"
658 "MetaInfo: [ContentType: 0]\n"
659 "Signature: [type: Unknown(65535), length: 0]\n");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800660}
661
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100662BOOST_AUTO_TEST_SUITE_END() // TestData
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800663
Spyridon Mastorakis429634f2015-02-19 17:35:33 -0800664} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800665} // namespace ndn