blob: 4672a83a6fbb96916fbc256ed1cf19bfb85de653 [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) {
171 return e.what() == "Requested wire format, but Data has not been signed"s;
172 });
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) {
242 return e.what() == "Expecting Data element, but TLV has type 66"s;
243 });
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,
333 [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
334 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,
338 [] (const auto& e) { return e.what() == "MetaInfo element is out of order"s; });
339 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,
343 [] (const auto& e) { return e.what() == "Content element is out of order"s; });
344 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,
348 [] (const auto& e) { return e.what() == "SignatureInfo element is out of order"s; });
349 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,
354 [] (const auto& e) { return e.what() == "SignatureValue element is out of order"s; });
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,
360 [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
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,
366 [] (const auto& e) { return e.what() == "SignatureInfo element is missing"s; });
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,
372 [] (const auto& e) { return e.what() == "SignatureValue element is missing"s; });
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,
381 [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
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,
390 [] (const auto& e) { return e.what() == "Unrecognized element of critical type 251"s; });
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)
526 BOOST_CHECK_THROW(d.setContent(Block{}), std::invalid_argument);
527
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500528 // span overload
529 d.setContent(nested);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400530 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400531 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400532 BOOST_TEST(d.getContent().value_bytes() == nested, boost::test_tools::per_element());
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500533 d.setContent(span<uint8_t>{});
Davide Pesavento81bd6962020-06-17 16:03:23 -0400534 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400535 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
536 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500537
Davide Pesavento81bd6962020-06-17 16:03:23 -0400538 // ConstBufferPtr overload
539 d.setContent(std::make_shared<Buffer>(direct, sizeof(direct)));
540 BOOST_CHECK_EQUAL(d.hasContent(), true);
541 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400542 BOOST_TEST(d.getContent().value_bytes() == direct, boost::test_tools::per_element());
Davide Pesavento81bd6962020-06-17 16:03:23 -0400543 d.setContent(std::make_shared<Buffer>());
544 BOOST_CHECK_EQUAL(d.hasContent(), true);
545 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
546 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400547 BOOST_CHECK_THROW(d.setContent(nullptr), std::invalid_argument);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400548
549 // unset
550 d.unsetContent();
551 BOOST_CHECK_EQUAL(d.hasContent(), false);
552 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Invalid);
553 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400554}
555
Davide Pesavento905d40f2020-06-09 21:33:25 -0400556BOOST_AUTO_TEST_CASE(SetSignatureValue)
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400557{
558 Data d;
559 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::Invalid);
560
Davide Pesavento487e3d32022-05-05 18:06:23 -0400561 // span overload
562 const uint8_t sv1[] = {0xbe, 0xef};
563 d.setSignatureValue(sv1);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400564 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::SignatureValue);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400565 BOOST_TEST(d.getSignatureValue().value_bytes() == sv1, boost::test_tools::per_element());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400566
Davide Pesavento487e3d32022-05-05 18:06:23 -0400567 // ConstBufferPtr overload
568 const uint8_t sv2[] = {0xfa, 0xca, 0xde};
569 d.setSignatureValue(std::make_shared<Buffer>(sv2, sizeof(sv2)));
570 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::SignatureValue);
571 BOOST_TEST(d.getSignatureValue().value_bytes() == sv2, boost::test_tools::per_element());
572 d.setSignatureValue(std::make_shared<Buffer>());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400573 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::SignatureValue);
574 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 0);
575
576 BOOST_CHECK_THROW(d.setSignatureValue(nullptr), std::invalid_argument);
577}
578
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -0500579BOOST_FIXTURE_TEST_CASE(ExtractSignedRanges, KeyChainFixture)
Eric Newberrye36aae12020-08-31 22:23:13 -0700580{
581 Data d1("/test/prefix");
582 m_keyChain.sign(d1);
583 auto ranges1 = d1.extractSignedRanges();
584 BOOST_REQUIRE_EQUAL(ranges1.size(), 1);
585 const Block& wire1 = d1.wireEncode();
586 const auto& sigInfoWire1 = wire1.find(tlv::SignatureInfo);
587 BOOST_REQUIRE(sigInfoWire1 != wire1.elements_end());
Davide Pesavento765abc92021-12-27 00:44:04 -0500588 BOOST_CHECK_EQUAL_COLLECTIONS(ranges1.front().begin(), ranges1.front().end(),
Eric Newberrye36aae12020-08-31 22:23:13 -0700589 wire1.value_begin(), sigInfoWire1->value_end());
590
591 // Test with decoded Data and ensure excludes elements after SignatureValue
592 const uint8_t WIRE[] = {
593 0x06, 0x0B, // Data
594 0x07, 0x00, // Name
595 0x16, 0x03, // SignatureInfo
596 0x1B, 0x01, // SignatureType
597 0x00,
598 0x17, 0x00, // SignatureValue
599 0xAA, 0x00 // Unrecognized non-critical element
600 };
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500601 Data d2(Block{WIRE});
Eric Newberrye36aae12020-08-31 22:23:13 -0700602 auto ranges2 = d2.extractSignedRanges();
603 BOOST_REQUIRE_EQUAL(ranges2.size(), 1);
Davide Pesavento765abc92021-12-27 00:44:04 -0500604 BOOST_CHECK_EQUAL_COLLECTIONS(ranges2.front().begin(), ranges2.front().end(), &WIRE[2], &WIRE[9]);
Eric Newberrye36aae12020-08-31 22:23:13 -0700605}
606
Junxiao Shi81206d52017-07-23 12:43:22 +0000607BOOST_AUTO_TEST_CASE(Equality)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700608{
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700609 Data a;
610 Data b;
611 BOOST_CHECK_EQUAL(a == b, true);
612 BOOST_CHECK_EQUAL(a != b, false);
613
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400614 a.setName("/A");
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700615 BOOST_CHECK_EQUAL(a == b, false);
616 BOOST_CHECK_EQUAL(a != b, true);
617
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400618 b.setName("/B");
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700619 BOOST_CHECK_EQUAL(a == b, false);
620 BOOST_CHECK_EQUAL(a != b, true);
621
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400622 b.setName("/A");
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700623 BOOST_CHECK_EQUAL(a == b, true);
624 BOOST_CHECK_EQUAL(a != b, false);
625
Davide Pesavento0f830802018-01-16 23:58:58 -0500626 a.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700627 BOOST_CHECK_EQUAL(a == b, false);
628 BOOST_CHECK_EQUAL(a != b, true);
629
Davide Pesavento0f830802018-01-16 23:58:58 -0500630 b.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700631 BOOST_CHECK_EQUAL(a == b, true);
632 BOOST_CHECK_EQUAL(a != b, false);
633
634 static const uint8_t someData[] = "someData";
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500635 a.setContent(someData);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700636 BOOST_CHECK_EQUAL(a == b, false);
637 BOOST_CHECK_EQUAL(a != b, true);
638
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500639 b.setContent(someData);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700640 BOOST_CHECK_EQUAL(a == b, true);
641 BOOST_CHECK_EQUAL(a != b, false);
642
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700643 a.setSignatureInfo(SignatureInfo(tlv::SignatureSha256WithRsa));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700644 BOOST_CHECK_EQUAL(a == b, false);
645 BOOST_CHECK_EQUAL(a != b, true);
646
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700647 b.setSignatureInfo(SignatureInfo(tlv::SignatureSha256WithRsa));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700648 BOOST_CHECK_EQUAL(a == b, true);
649 BOOST_CHECK_EQUAL(a != b, false);
650}
651
Junxiao Shi81206d52017-07-23 12:43:22 +0000652BOOST_AUTO_TEST_CASE(Print)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700653{
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500654 Data d1(Block{DATA1});
Davide Pesavento81bd6962020-06-17 16:03:23 -0400655 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(d1),
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700656 "Name: /local/ndn/prefix\n"
Davide Pesavento81bd6962020-06-17 16:03:23 -0400657 "MetaInfo: [ContentType: 0, FreshnessPeriod: 10000 milliseconds]\n"
658 "Content: [8 bytes]\n"
659 "Signature: [type: SignatureSha256WithRsa, length: 128]\n");
660
661 Data d2("/foo");
662 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(d2),
663 "Name: /foo\n"
664 "MetaInfo: [ContentType: 0]\n"
665 "Signature: [type: Unknown(65535), length: 0]\n");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800666}
667
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100668BOOST_AUTO_TEST_SUITE_END() // TestData
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800669
Davide Pesavento47ce2ee2023-05-09 01:33:33 -0400670} // namespace ndn::tests