blob: cb7de5b171e78e50196af36b039bdbd58e22f5a8 [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
Davide Pesavento47ce2ee2023-05-09 01:33:33 -040037namespace ndn::tests {
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080038
Davide Pesavento152ef442023-04-22 02:02:29 -040039BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Data>));
40BOOST_CONCEPT_ASSERT((WireEncodable<Data>));
41BOOST_CONCEPT_ASSERT((WireEncodableWithEncodingBuffer<Data>));
42BOOST_CONCEPT_ASSERT((WireDecodable<Data>));
43static_assert(std::is_convertible_v<Data::Error*, tlv::Error*>,
44 "Data::Error must inherit from tlv::Error");
45
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080046BOOST_AUTO_TEST_SUITE(TestData)
47
Junxiao Shi81206d52017-07-23 12:43:22 +000048const uint8_t CONTENT1[] = {0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21};
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080049
Junxiao Shi81206d52017-07-23 12:43:22 +000050const uint8_t DATA1[] = {
Davide Pesavento14c56cd2020-05-21 01:44:03 -040051 0x06, 0xc5, // Data
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070052 0x07, 0x14, // Name
Davide Pesavento14c56cd2020-05-21 01:44:03 -040053 0x08, 0x05,
54 0x6c, 0x6f, 0x63, 0x61, 0x6c,
55 0x08, 0x03,
56 0x6e, 0x64, 0x6e,
57 0x08, 0x06,
58 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080059 0x14, 0x04, // MetaInfo
Davide Pesavento14c56cd2020-05-21 01:44:03 -040060 0x19, 0x02, // FreshnessPeriod
61 0x27, 0x10,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070062 0x15, 0x08, // Content
Davide Pesavento14c56cd2020-05-21 01:44:03 -040063 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080064 0x16, 0x1b, // SignatureInfo
Davide Pesavento14c56cd2020-05-21 01:44:03 -040065 0x1b, 0x01, // SignatureType
66 0x01,
67 0x1c, 0x16, // KeyLocator
68 0x07, 0x14, // Name
69 0x08, 0x04,
70 0x74, 0x65, 0x73, 0x74,
71 0x08, 0x03,
72 0x6b, 0x65, 0x79,
73 0x08, 0x07,
74 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080075 0x17, 0x80, // SignatureValue
Davide Pesavento14c56cd2020-05-21 01:44:03 -040076 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31,
77 0xec, 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9,
78 0xb3, 0xc6, 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8,
79 0xb3, 0x6a, 0x38, 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6,
80 0x4d, 0x10, 0x1d, 0xdc, 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96,
81 0x5e, 0xc0, 0x62, 0x0b, 0xcf, 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41,
82 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9, 0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d,
83 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8, 0x55, 0xf6, 0x1c, 0x19, 0x0b,
84 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7, 0xaa, 0x0d, 0x14, 0x58,
85 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3, 0xfc, 0x90, 0x7a,
86 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080087};
88
Junxiao Shi81206d52017-07-23 12:43:22 +000089BOOST_AUTO_TEST_CASE(DefaultConstructor)
90{
91 Data d;
92 BOOST_CHECK_EQUAL(d.hasWire(), false);
93 BOOST_CHECK_EQUAL(d.getName(), "/");
94 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
95 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), DEFAULT_FRESHNESS_PERIOD);
Junxiao Shi7d9039b2018-04-14 15:56:28 +000096 BOOST_CHECK(!d.getFinalBlock());
Davide Pesavento81bd6962020-06-17 16:03:23 -040097 BOOST_CHECK_EQUAL(d.hasContent(), false);
98 BOOST_CHECK_EQUAL(d.getContent().isValid(), false);
Junxiao Shi81206d52017-07-23 12:43:22 +000099 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700100 BOOST_CHECK(!d.getSignatureInfo());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400101 BOOST_CHECK_EQUAL(d.getSignatureType(), -1);
102 BOOST_CHECK(!d.getKeyLocator());
103 BOOST_CHECK_EQUAL(d.getSignatureValue().isValid(), false);
Junxiao Shi81206d52017-07-23 12:43:22 +0000104}
105
106class DataSigningKeyFixture
107{
108protected:
109 DataSigningKeyFixture()
110 {
Davide Pesavento765abc92021-12-27 00:44:04 -0500111 m_privKey.loadPkcs1(PRIVATE_KEY_DER);
Junxiao Shi81206d52017-07-23 12:43:22 +0000112 auto buf = m_privKey.derivePublicKey();
Davide Pesavento765abc92021-12-27 00:44:04 -0500113 m_pubKey.loadPkcs8(*buf);
Junxiao Shi81206d52017-07-23 12:43:22 +0000114 }
115
116protected:
117 security::transform::PrivateKey m_privKey;
118 security::transform::PublicKey m_pubKey;
119
120private:
Davide Pesavento05ec0be2023-03-14 21:18:06 -0400121 static constexpr uint8_t PRIVATE_KEY_DER[] = {
122 0x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
123 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82, 0x02, 0x5a, 0x02, 0x01,
124 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e, 0x47, 0x85, 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47,
125 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05, 0x3a, 0x24, 0x1e, 0xeb, 0x89, 0x01, 0xbb, 0xe9,
126 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68, 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7,
127 0x06, 0x90, 0x9c, 0xaa, 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3,
128 0x1b, 0x88, 0x9a, 0x97, 0x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82,
129 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d, 0x24, 0xc2, 0x63, 0xf3, 0x97, 0x17, 0xeb, 0xfe,
130 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f, 0xb8, 0xf2, 0xf1, 0xc5,
131 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed, 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76,
132 0x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11, 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0,
133 0x2a, 0xe3, 0x6b, 0x0c, 0x8b, 0x73, 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c,
134 0x5b, 0x43, 0x29, 0xad, 0x3a, 0x3b, 0x93, 0xa3, 0x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e,
135 0x33, 0x3f, 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44, 0x00, 0xde, 0x72, 0xed,
136 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2, 0x69, 0x1f,
137 0xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13, 0x06, 0x69, 0x06, 0xd8,
138 0x3f, 0x22, 0x15, 0x75, 0xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66, 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2,
139 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37, 0x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88,
140 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f, 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02, 0x41, 0x00, 0xb6, 0x2e,
141 0xbb, 0xcd, 0x2f, 0x3a, 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e,
142 0x64, 0xa7, 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae,
143 0xb0, 0x74, 0xa6, 0x99, 0xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e, 0x56, 0xad,
144 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c, 0xb7, 0x9a, 0x3e, 0x99, 0xef, 0xb9, 0x02, 0x41,
145 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1, 0xac, 0xee, 0xcb, 0x41, 0x81, 0xc6,
146 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21, 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96,
147 0x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8, 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6,
148 0x90, 0xb5, 0xce, 0x1b, 0x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a,
149 0x7f, 0x02, 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0, 0x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89,
150 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee, 0x51, 0x57, 0xd5, 0x97,
151 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e, 0x88, 0x63, 0xe2, 0x66,
152 0x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a, 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca,
153 0x78, 0xab, 0x21, 0x02, 0x41, 0x00, 0x8f, 0xae, 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24,
154 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81, 0xbc, 0x2c, 0x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d,
155 0x28, 0xd9, 0x10, 0x1a, 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14, 0xbf, 0xc9, 0xff, 0x17,
156 0xd6, 0x47, 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
157 0xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a, 0x33, 0x2f,
158 0x4b, 0xa2, 0xbd, 0xd1, 0xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15, 0x37, 0x1b, 0xde, 0x76,
159 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9, 0x4f, 0x35, 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95,
160 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21, 0x6d, 0xa0, 0x84, 0x39, 0xe9, 0x2e, 0x1e, 0xfc,
161 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d, 0x0a, 0xb6,
162 };
Junxiao Shi81206d52017-07-23 12:43:22 +0000163};
164
Davide Pesavento905d40f2020-06-09 21:33:25 -0400165BOOST_AUTO_TEST_SUITE(Encode)
166
167BOOST_AUTO_TEST_CASE(NotSigned)
Junxiao Shi81206d52017-07-23 12:43:22 +0000168{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400169 Data d;
170 BOOST_CHECK_EXCEPTION(d.wireEncode(), tlv::Error, [] (const auto& e) {
Davide Pesavento296c3a12023-05-04 21:40:40 -0400171 return e.what() == "Requested wire format, but Data has not been signed"sv;
Davide Pesavento905d40f2020-06-09 21:33:25 -0400172 });
173}
174
175BOOST_AUTO_TEST_CASE(Minimal)
176{
177 Data d;
178 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
179 d.setSignatureValue(std::make_shared<Buffer>());
Davide Pesavento81bd6962020-06-17 16:03:23 -0400180 BOOST_CHECK_EQUAL(d.wireEncode(), "060B 0700 1400 16031B0100 1700"_block);
Davide Pesavento905d40f2020-06-09 21:33:25 -0400181}
182
183BOOST_FIXTURE_TEST_CASE(Full, DataSigningKeyFixture)
184{
185 Data d("/local/ndn/prefix");
Junxiao Shi81206d52017-07-23 12:43:22 +0000186 d.setContentType(tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500187 d.setFreshnessPeriod(10_s);
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500188 d.setContent(CONTENT1);
Junxiao Shi81206d52017-07-23 12:43:22 +0000189
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400190 SignatureInfo signatureInfo;
191 signatureInfo.setSignatureType(tlv::SignatureSha256WithRsa);
192 signatureInfo.setKeyLocator(Name("/test/key/locator"));
193 d.setSignatureInfo(signatureInfo);
Junxiao Shi81206d52017-07-23 12:43:22 +0000194
195 OBufferStream sig;
196 {
197 namespace tr = security::transform;
198
199 tr::StepSource input;
200 input >> tr::signerFilter(DigestAlgorithm::SHA256, m_privKey) >> tr::streamSink(sig);
201
Davide Pesavento258d51a2022-02-27 21:26:28 -0500202 input.write(d.getName().wireEncode());
203 input.write(d.getMetaInfo().wireEncode());
204 input.write(d.getContent());
205 input.write(signatureInfo.wireEncode());
Junxiao Shi81206d52017-07-23 12:43:22 +0000206 input.end();
207 }
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400208 d.setSignatureValue(sig.buf());
Junxiao Shi81206d52017-07-23 12:43:22 +0000209
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500210 BOOST_TEST(d.wireEncode() == DATA1, boost::test_tools::per_element());
Junxiao Shi81206d52017-07-23 12:43:22 +0000211}
212
Davide Pesavento905d40f2020-06-09 21:33:25 -0400213BOOST_AUTO_TEST_SUITE_END() // Encode
Junxiao Shi81206d52017-07-23 12:43:22 +0000214
Davide Pesavento905d40f2020-06-09 21:33:25 -0400215class DecodeFixture
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000216{
217protected:
Davide Pesavento905d40f2020-06-09 21:33:25 -0400218 DecodeFixture()
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000219 {
220 // initialize all elements to non-empty, to verify wireDecode clears them
221 d.setName("/A");
222 d.setContentType(tlv::ContentType_Key);
Davide Pesavento905d40f2020-06-09 21:33:25 -0400223 d.setFreshnessPeriod(123_s);
224 d.setFinalBlock(name::Component::fromNumber(42));
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000225 d.setContent("1504C0C1C2C3"_block);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700226 d.setSignatureInfo(SignatureInfo("160A 1B0101 1C050703080142"_block));
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400227 d.setSignatureValue(fromHex("B48F1707A3BCA3CFC5F32DE51D9B46C32D7D262A21544EBDA88C3B415D637503"
228 "FC9BEF20F88202A56AF9831E0D30205FD4154B08502BCDEE860267A5C3E03D8E"
229 "A6CB74BE391C01E0A57B991B4404FC11B7D777F1B700A4B65F201118CF1840A8"
230 "30A2A7C17DB4B7A8777E58515121AF9E2498627F8475414CDFD9801B8152AD5B"));
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000231 }
232
233protected:
234 Data d;
235};
236
Davide Pesavento905d40f2020-06-09 21:33:25 -0400237BOOST_FIXTURE_TEST_SUITE(Decode, DecodeFixture)
238
239BOOST_AUTO_TEST_CASE(NotData)
240{
241 BOOST_CHECK_EXCEPTION(d.wireDecode("4202CAFE"_block), tlv::Error, [] (const auto& e) {
Davide Pesavento296c3a12023-05-04 21:40:40 -0400242 return e.what() == "Expecting Data element, but TLV has type 66"sv;
Davide Pesavento905d40f2020-06-09 21:33:25 -0400243 });
244}
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000245
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000246BOOST_AUTO_TEST_CASE(Minimal)
247{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400248 d.wireDecode("062C 0703(080144) 1603(1B0100) "
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000249 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
250 BOOST_CHECK_EQUAL(d.getName(), "/D");
Davide Pesaventoef654dd2019-07-18 20:02:44 -0400251 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
252 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
253 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400254 BOOST_CHECK_EQUAL(d.hasContent(), false);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000255 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400256 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::DigestSha256);
257 BOOST_CHECK_EQUAL(d.getKeyLocator().has_value(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700258 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 32);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000259
260 // encode without modification: retain original wire encoding
Davide Pesavento905d40f2020-06-09 21:33:25 -0400261 BOOST_CHECK_EQUAL(d.hasWire(), true);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000262 BOOST_CHECK_EQUAL(d.wireEncode().value_size(), 44);
263
Davide Pesavento905d40f2020-06-09 21:33:25 -0400264 // modify then re-encode
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000265 d.setName("/E");
Davide Pesavento905d40f2020-06-09 21:33:25 -0400266 BOOST_CHECK_EQUAL(d.hasWire(), false);
Junxiao Shi72c0c642018-04-20 15:41:09 +0000267 BOOST_CHECK_EQUAL(d.wireEncode(),
Davide Pesavento81bd6962020-06-17 16:03:23 -0400268 "062E 0703(080145) 1400 1603(1B0100) "
Davide Pesavento905d40f2020-06-09 21:33:25 -0400269 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000270}
271
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700272BOOST_AUTO_TEST_CASE(MinimalEmptyName)
273{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400274 d.wireDecode("0609 0700 1603(1B0100) 1700"_block);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700275 BOOST_CHECK_EQUAL(d.getName(), "/"); // empty Name is allowed in Data
276 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
277 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
278 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400279 BOOST_CHECK_EQUAL(d.hasContent(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700280 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400281 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::DigestSha256);
282 BOOST_CHECK_EQUAL(d.getKeyLocator().has_value(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700283 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 0);
284}
285
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000286BOOST_AUTO_TEST_CASE(Full)
287{
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500288 d.wireDecode(Block(DATA1));
Davide Pesavento905d40f2020-06-09 21:33:25 -0400289 BOOST_CHECK_EQUAL(d.getName(), "/local/ndn/prefix");
290 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
291 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 10_s);
292 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400293 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento258d51a2022-02-27 21:26:28 -0500294 BOOST_CHECK_EQUAL(readString(d.getContent()), "SUCCESS!");
Davide Pesavento905d40f2020-06-09 21:33:25 -0400295 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::SignatureSha256WithRsa);
296 BOOST_REQUIRE(d.getKeyLocator().has_value());
297 BOOST_CHECK_EQUAL(d.getKeyLocator()->getName(), "/test/key/locator");
298 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 128);
299}
300
301BOOST_AUTO_TEST_CASE(UnrecognizedNonCriticalElements)
302{
303 d.wireDecode("063A 0703(080144) FC00 1400 FC00 1500 FC00 1603(1B0100) FC00 "
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000304 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 FC00"_block);
305 BOOST_CHECK_EQUAL(d.getName(), "/D");
Davide Pesaventoef654dd2019-07-18 20:02:44 -0400306 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
307 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
308 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400309 BOOST_CHECK_EQUAL(d.hasContent(), true);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000310 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400311 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::DigestSha256);
312 BOOST_CHECK_EQUAL(d.getKeyLocator().has_value(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700313 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 32);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000314
315 // encode without modification: retain original wire encoding
Davide Pesavento905d40f2020-06-09 21:33:25 -0400316 BOOST_CHECK_EQUAL(d.hasWire(), true);
Junxiao Shi8b753a22018-10-24 01:51:40 +0000317 BOOST_CHECK_EQUAL(d.wireEncode().value_size(), 58);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000318
Davide Pesavento905d40f2020-06-09 21:33:25 -0400319 // modify then re-encode
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000320 d.setName("/E");
Davide Pesavento905d40f2020-06-09 21:33:25 -0400321 BOOST_CHECK_EQUAL(d.hasWire(), false);
Junxiao Shi72c0c642018-04-20 15:41:09 +0000322 BOOST_CHECK_EQUAL(d.wireEncode(),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400323 "0630 0703080145 1400 1500 16031B0100 "
324 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000325}
326
327BOOST_AUTO_TEST_CASE(CriticalElementOutOfOrder)
328{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400329 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000330 "0630 1400 0703080145 1500 16031B0100 "
331 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400332 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400333 [] (const auto& e) { return e.what() == "Name element is missing or out of order"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400334 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000335 "0630 0703080145 1500 1400 16031B0100 "
336 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400337 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400338 [] (const auto& e) { return e.what() == "MetaInfo element is out of order"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400339 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000340 "0630 0703080145 1400 16031B0100 1500 "
341 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400342 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400343 [] (const auto& e) { return e.what() == "Content element is out of order"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400344 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000345 "0630 0703080145 1400 1500 "
346 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 16031B0100"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400347 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400348 [] (const auto& e) { return e.what() == "SignatureInfo element is out of order"sv; });
Davide Pesavento905d40f2020-06-09 21:33:25 -0400349 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000350 "0652 0703080145 1400 1500 16031B0100 "
351 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"
352 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400353 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400354 [] (const auto& e) { return e.what() == "SignatureValue element is out of order"sv; });
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000355}
356
Davide Pesavento905d40f2020-06-09 21:33:25 -0400357BOOST_AUTO_TEST_CASE(MissingName)
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000358{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400359 BOOST_CHECK_EXCEPTION(d.wireDecode("0607 16031B0100 1700"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400360 [] (const auto& e) { return e.what() == "Name element is missing or out of order"sv; });
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000361}
362
Davide Pesavento905d40f2020-06-09 21:33:25 -0400363BOOST_AUTO_TEST_CASE(MissingSignatureInfo)
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000364{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400365 BOOST_CHECK_EXCEPTION(d.wireDecode("0607 0703080144 1700"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400366 [] (const auto& e) { return e.what() == "SignatureInfo element is missing"sv; });
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700367}
368
Davide Pesavento905d40f2020-06-09 21:33:25 -0400369BOOST_AUTO_TEST_CASE(MissingSignatureValue)
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700370{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400371 BOOST_CHECK_EXCEPTION(d.wireDecode("0607 0700 16031B0100"_block), tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400372 [] (const auto& e) { return e.what() == "SignatureValue element is missing"sv; });
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000373}
374
Junxiao Shi8b753a22018-10-24 01:51:40 +0000375BOOST_AUTO_TEST_CASE(UnrecognizedNonCriticalElementBeforeName)
376{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400377 BOOST_CHECK_EXCEPTION(d.wireDecode(
378 "062E FC00 0703080144 16031B0100 "
379 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
380 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400381 [] (const auto& e) { return e.what() == "Name element is missing or out of order"sv; });
Junxiao Shi8b753a22018-10-24 01:51:40 +0000382}
383
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000384BOOST_AUTO_TEST_CASE(UnrecognizedCriticalElement)
385{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400386 BOOST_CHECK_EXCEPTION(d.wireDecode(
387 "0632 0703080145 FB00 1400 1500 16031B0100 "
388 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
389 tlv::Error,
Davide Pesavento296c3a12023-05-04 21:40:40 -0400390 [] (const auto& e) { return e.what() == "Unrecognized element of critical type 251"sv; });
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000391}
392
Davide Pesavento905d40f2020-06-09 21:33:25 -0400393BOOST_AUTO_TEST_SUITE_END() // Decode
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000394
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -0500395BOOST_FIXTURE_TEST_CASE(FullName, KeyChainFixture)
Junxiao Shi81206d52017-07-23 12:43:22 +0000396{
397 Data d(Name("/local/ndn/prefix"));
398 d.setContentType(tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500399 d.setFreshnessPeriod(10_s);
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500400 d.setContent(CONTENT1);
Junxiao Shi81206d52017-07-23 12:43:22 +0000401 BOOST_CHECK_THROW(d.getFullName(), Data::Error); // FullName is unavailable without signing
402
403 m_keyChain.sign(d);
404 BOOST_CHECK_EQUAL(d.hasWire(), true);
405 Name fullName = d.getFullName(); // FullName is available after signing
406
407 BOOST_CHECK_EQUAL(d.getName().size() + 1, fullName.size());
408 BOOST_CHECK_EQUAL_COLLECTIONS(d.getName().begin(), d.getName().end(),
409 fullName.begin(), fullName.end() - 1);
410 BOOST_CHECK_EQUAL(fullName.get(-1).value_size(), util::Sha256::DIGEST_SIZE);
411
412 // FullName should be cached, so value() pointer points to same memory location
413 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
414
Davide Pesavento0f830802018-01-16 23:58:58 -0500415 d.setFreshnessPeriod(100_s); // invalidates FullName
Junxiao Shi81206d52017-07-23 12:43:22 +0000416 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
417
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500418 Data d1(Block{DATA1});
Junxiao Shi81206d52017-07-23 12:43:22 +0000419 BOOST_CHECK_EQUAL(d1.getFullName(),
420 "/local/ndn/prefix/"
421 "sha256digest=28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548");
422}
423
Davide Pesavento905d40f2020-06-09 21:33:25 -0400424BOOST_AUTO_TEST_CASE(SetName)
425{
426 Data d;
427 d.setName("/first");
428 BOOST_CHECK_EQUAL(d.getName(), "/first");
429 BOOST_CHECK_EQUAL(d.hasWire(), false);
430
431 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
432 d.setSignatureValue(std::make_shared<Buffer>());
433 d.wireEncode();
434 BOOST_CHECK_EQUAL(d.hasWire(), true);
435 d.setName("/first");
436 BOOST_CHECK_EQUAL(d.getName(), "/first");
437 BOOST_CHECK_EQUAL(d.hasWire(), true);
438
439 d.setName("/second");
440 BOOST_CHECK_EQUAL(d.getName(), "/second");
441 BOOST_CHECK_EQUAL(d.hasWire(), false);
442}
443
444BOOST_AUTO_TEST_CASE(SetContentType)
445{
446 Data d;
447 d.setContentType(tlv::ContentType_Key);
448 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Key);
449 BOOST_CHECK_EQUAL(d.hasWire(), false);
450
451 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
452 d.setSignatureValue(std::make_shared<Buffer>());
453 d.wireEncode();
454 BOOST_CHECK_EQUAL(d.hasWire(), true);
455 d.setContentType(tlv::ContentType_Key);
456 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Key);
457 BOOST_CHECK_EQUAL(d.hasWire(), true);
458
459 d.setContentType(tlv::ContentType_PrefixAnn);
460 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_PrefixAnn);
461 BOOST_CHECK_EQUAL(d.hasWire(), false);
462}
463
464BOOST_AUTO_TEST_CASE(SetFreshnessPeriod)
465{
466 Data d;
467 d.setFreshnessPeriod(15_min);
468 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 15_min);
469 BOOST_CHECK_EQUAL(d.hasWire(), false);
470
471 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
472 d.setSignatureValue(std::make_shared<Buffer>());
473 d.wireEncode();
474 BOOST_CHECK_EQUAL(d.hasWire(), true);
475 d.setFreshnessPeriod(15_min);
476 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 15_min);
477 BOOST_CHECK_EQUAL(d.hasWire(), true);
478
479 d.setFreshnessPeriod(1_h);
480 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 1_h);
481 BOOST_CHECK_EQUAL(d.hasWire(), false);
482}
483
484BOOST_AUTO_TEST_CASE(SetFinalBlock)
485{
486 Data d;
487 d.setFinalBlock(name::Component("foo"));
488 BOOST_CHECK(d.getFinalBlock() == name::Component("foo"));
489 BOOST_CHECK_EQUAL(d.hasWire(), false);
490
491 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
492 d.setSignatureValue(std::make_shared<Buffer>());
493 d.wireEncode();
494 BOOST_CHECK_EQUAL(d.hasWire(), true);
495 d.setFinalBlock(name::Component("foo"));
496 BOOST_CHECK(d.getFinalBlock() == name::Component("foo"));
497 BOOST_CHECK_EQUAL(d.hasWire(), true);
498
499 d.setFinalBlock(name::Component("bar"));
500 BOOST_CHECK(d.getFinalBlock() == name::Component("bar"));
501 BOOST_CHECK_EQUAL(d.hasWire(), false);
502}
503
504BOOST_AUTO_TEST_CASE(SetContent)
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400505{
506 Data d;
Davide Pesavento81bd6962020-06-17 16:03:23 -0400507 BOOST_CHECK_EQUAL(d.hasContent(), false);
508 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Invalid);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400509 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
510
Davide Pesavento81bd6962020-06-17 16:03:23 -0400511 // Block overload, used directly as Content
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400512 const uint8_t direct[] = {0xca, 0xfe};
Davide Pesavento81bd6962020-06-17 16:03:23 -0400513 d.setContent("1502CAFE"_block);
514 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400515 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400516 BOOST_TEST(d.getContent().value_bytes() == direct, boost::test_tools::per_element());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400517
Davide Pesavento81bd6962020-06-17 16:03:23 -0400518 // Block overload, nested inside Content element
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400519 const uint8_t nested[] = {0x99, 0x02, 0xca, 0xfe};
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500520 d.setContent(Block(nested));
Davide Pesavento81bd6962020-06-17 16:03:23 -0400521 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400522 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400523 BOOST_TEST(d.getContent().value_bytes() == nested, boost::test_tools::per_element());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400524
Davide Pesavento81bd6962020-06-17 16:03:23 -0400525 // Block overload, default constructed (invalid)
Davide Pesavento296c3a12023-05-04 21:40:40 -0400526 BOOST_CHECK_EXCEPTION(d.setContent(Block{}), std::invalid_argument, [] (const auto& e) {
527 return e.what() == "Content block must be valid"sv;
528 });
Davide Pesavento81bd6962020-06-17 16:03:23 -0400529
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500530 // span overload
531 d.setContent(nested);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400532 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400533 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400534 BOOST_TEST(d.getContent().value_bytes() == nested, boost::test_tools::per_element());
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500535 d.setContent(span<uint8_t>{});
Davide Pesavento81bd6962020-06-17 16:03:23 -0400536 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento296c3a12023-05-04 21:40:40 -0400537 BOOST_CHECK_EQUAL(d.getContent(), "1500"_block);
538
539 // string_view overload
540 d.setContent("hi"sv);
541 BOOST_CHECK_EQUAL(d.hasContent(), true);
542 BOOST_CHECK_EQUAL(d.getContent(), "15026869"_block);
543 d.setContent("");
544 BOOST_CHECK_EQUAL(d.hasContent(), true);
545 BOOST_CHECK_EQUAL(d.getContent(), "1500"_block);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500546
Davide Pesavento81bd6962020-06-17 16:03:23 -0400547 // ConstBufferPtr overload
548 d.setContent(std::make_shared<Buffer>(direct, sizeof(direct)));
549 BOOST_CHECK_EQUAL(d.hasContent(), true);
550 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400551 BOOST_TEST(d.getContent().value_bytes() == direct, boost::test_tools::per_element());
Davide Pesavento81bd6962020-06-17 16:03:23 -0400552 d.setContent(std::make_shared<Buffer>());
553 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento296c3a12023-05-04 21:40:40 -0400554 BOOST_CHECK_EQUAL(d.getContent(), "1500"_block);
555
556 // ConstBufferPtr overload, null/empty pointer (invalid)
557 BOOST_CHECK_EXCEPTION(d.setContent(ConstBufferPtr{}), std::invalid_argument, [] (const auto& e) {
558 return e.what() == "Content buffer cannot be null"sv;
559 });
Davide Pesavento81bd6962020-06-17 16:03:23 -0400560
561 // unset
562 d.unsetContent();
563 BOOST_CHECK_EQUAL(d.hasContent(), false);
564 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Invalid);
565 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400566}
567
Davide Pesavento905d40f2020-06-09 21:33:25 -0400568BOOST_AUTO_TEST_CASE(SetSignatureValue)
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400569{
570 Data d;
571 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::Invalid);
572
Davide Pesavento487e3d32022-05-05 18:06:23 -0400573 // span overload
574 const uint8_t sv1[] = {0xbe, 0xef};
575 d.setSignatureValue(sv1);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400576 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::SignatureValue);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400577 BOOST_TEST(d.getSignatureValue().value_bytes() == sv1, boost::test_tools::per_element());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400578
Davide Pesavento487e3d32022-05-05 18:06:23 -0400579 // ConstBufferPtr overload
580 const uint8_t sv2[] = {0xfa, 0xca, 0xde};
581 d.setSignatureValue(std::make_shared<Buffer>(sv2, sizeof(sv2)));
582 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::SignatureValue);
583 BOOST_TEST(d.getSignatureValue().value_bytes() == sv2, boost::test_tools::per_element());
584 d.setSignatureValue(std::make_shared<Buffer>());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400585 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::SignatureValue);
586 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 0);
587
Davide Pesavento296c3a12023-05-04 21:40:40 -0400588 // ConstBufferPtr overload, null/empty pointer (invalid)
589 BOOST_CHECK_EXCEPTION(d.setSignatureValue(ConstBufferPtr{}), std::invalid_argument, [] (const auto& e) {
590 return e.what() == "SignatureValue buffer cannot be null"sv;
591 });
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400592}
593
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -0500594BOOST_FIXTURE_TEST_CASE(ExtractSignedRanges, KeyChainFixture)
Eric Newberrye36aae12020-08-31 22:23:13 -0700595{
596 Data d1("/test/prefix");
597 m_keyChain.sign(d1);
598 auto ranges1 = d1.extractSignedRanges();
599 BOOST_REQUIRE_EQUAL(ranges1.size(), 1);
600 const Block& wire1 = d1.wireEncode();
601 const auto& sigInfoWire1 = wire1.find(tlv::SignatureInfo);
602 BOOST_REQUIRE(sigInfoWire1 != wire1.elements_end());
Davide Pesavento765abc92021-12-27 00:44:04 -0500603 BOOST_CHECK_EQUAL_COLLECTIONS(ranges1.front().begin(), ranges1.front().end(),
Eric Newberrye36aae12020-08-31 22:23:13 -0700604 wire1.value_begin(), sigInfoWire1->value_end());
605
606 // Test with decoded Data and ensure excludes elements after SignatureValue
607 const uint8_t WIRE[] = {
608 0x06, 0x0B, // Data
609 0x07, 0x00, // Name
610 0x16, 0x03, // SignatureInfo
611 0x1B, 0x01, // SignatureType
612 0x00,
613 0x17, 0x00, // SignatureValue
614 0xAA, 0x00 // Unrecognized non-critical element
615 };
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500616 Data d2(Block{WIRE});
Eric Newberrye36aae12020-08-31 22:23:13 -0700617 auto ranges2 = d2.extractSignedRanges();
618 BOOST_REQUIRE_EQUAL(ranges2.size(), 1);
Davide Pesavento765abc92021-12-27 00:44:04 -0500619 BOOST_CHECK_EQUAL_COLLECTIONS(ranges2.front().begin(), ranges2.front().end(), &WIRE[2], &WIRE[9]);
Eric Newberrye36aae12020-08-31 22:23:13 -0700620}
621
Junxiao Shi81206d52017-07-23 12:43:22 +0000622BOOST_AUTO_TEST_CASE(Equality)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700623{
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700624 Data a;
625 Data b;
626 BOOST_CHECK_EQUAL(a == b, true);
627 BOOST_CHECK_EQUAL(a != b, false);
628
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400629 a.setName("/A");
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700630 BOOST_CHECK_EQUAL(a == b, false);
631 BOOST_CHECK_EQUAL(a != b, true);
632
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400633 b.setName("/B");
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700634 BOOST_CHECK_EQUAL(a == b, false);
635 BOOST_CHECK_EQUAL(a != b, true);
636
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400637 b.setName("/A");
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700638 BOOST_CHECK_EQUAL(a == b, true);
639 BOOST_CHECK_EQUAL(a != b, false);
640
Davide Pesavento0f830802018-01-16 23:58:58 -0500641 a.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700642 BOOST_CHECK_EQUAL(a == b, false);
643 BOOST_CHECK_EQUAL(a != b, true);
644
Davide Pesavento0f830802018-01-16 23:58:58 -0500645 b.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700646 BOOST_CHECK_EQUAL(a == b, true);
647 BOOST_CHECK_EQUAL(a != b, false);
648
649 static const uint8_t someData[] = "someData";
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500650 a.setContent(someData);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700651 BOOST_CHECK_EQUAL(a == b, false);
652 BOOST_CHECK_EQUAL(a != b, true);
653
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500654 b.setContent(someData);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700655 BOOST_CHECK_EQUAL(a == b, true);
656 BOOST_CHECK_EQUAL(a != b, false);
657
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700658 a.setSignatureInfo(SignatureInfo(tlv::SignatureSha256WithRsa));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700659 BOOST_CHECK_EQUAL(a == b, false);
660 BOOST_CHECK_EQUAL(a != b, true);
661
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700662 b.setSignatureInfo(SignatureInfo(tlv::SignatureSha256WithRsa));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700663 BOOST_CHECK_EQUAL(a == b, true);
664 BOOST_CHECK_EQUAL(a != b, false);
665}
666
Junxiao Shi81206d52017-07-23 12:43:22 +0000667BOOST_AUTO_TEST_CASE(Print)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700668{
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500669 Data d1(Block{DATA1});
Davide Pesavento81bd6962020-06-17 16:03:23 -0400670 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(d1),
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700671 "Name: /local/ndn/prefix\n"
Davide Pesavento81bd6962020-06-17 16:03:23 -0400672 "MetaInfo: [ContentType: 0, FreshnessPeriod: 10000 milliseconds]\n"
673 "Content: [8 bytes]\n"
674 "Signature: [type: SignatureSha256WithRsa, length: 128]\n");
675
676 Data d2("/foo");
677 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(d2),
678 "Name: /foo\n"
679 "MetaInfo: [ContentType: 0]\n"
680 "Signature: [type: Unknown(65535), length: 0]\n");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800681}
682
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100683BOOST_AUTO_TEST_SUITE_END() // TestData
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800684
Davide Pesavento47ce2ee2023-05-09 01:33:33 -0400685} // namespace ndn::tests