blob: 5706a3ee95cc613b1b963e6bb305ee641c492857 [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
Davide Pesavento152ef442023-04-22 02:02:29 -040040BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Data>));
41BOOST_CONCEPT_ASSERT((WireEncodable<Data>));
42BOOST_CONCEPT_ASSERT((WireEncodableWithEncodingBuffer<Data>));
43BOOST_CONCEPT_ASSERT((WireDecodable<Data>));
44static_assert(std::is_convertible_v<Data::Error*, tlv::Error*>,
45 "Data::Error must inherit from tlv::Error");
46
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080047BOOST_AUTO_TEST_SUITE(TestData)
48
Junxiao Shi81206d52017-07-23 12:43:22 +000049const uint8_t CONTENT1[] = {0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21};
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080050
Junxiao Shi81206d52017-07-23 12:43:22 +000051const uint8_t DATA1[] = {
Davide Pesavento14c56cd2020-05-21 01:44:03 -040052 0x06, 0xc5, // Data
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070053 0x07, 0x14, // Name
Davide Pesavento14c56cd2020-05-21 01:44:03 -040054 0x08, 0x05,
55 0x6c, 0x6f, 0x63, 0x61, 0x6c,
56 0x08, 0x03,
57 0x6e, 0x64, 0x6e,
58 0x08, 0x06,
59 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080060 0x14, 0x04, // MetaInfo
Davide Pesavento14c56cd2020-05-21 01:44:03 -040061 0x19, 0x02, // FreshnessPeriod
62 0x27, 0x10,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070063 0x15, 0x08, // Content
Davide Pesavento14c56cd2020-05-21 01:44:03 -040064 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080065 0x16, 0x1b, // SignatureInfo
Davide Pesavento14c56cd2020-05-21 01:44:03 -040066 0x1b, 0x01, // SignatureType
67 0x01,
68 0x1c, 0x16, // KeyLocator
69 0x07, 0x14, // Name
70 0x08, 0x04,
71 0x74, 0x65, 0x73, 0x74,
72 0x08, 0x03,
73 0x6b, 0x65, 0x79,
74 0x08, 0x07,
75 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080076 0x17, 0x80, // SignatureValue
Davide Pesavento14c56cd2020-05-21 01:44:03 -040077 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31,
78 0xec, 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9,
79 0xb3, 0xc6, 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8,
80 0xb3, 0x6a, 0x38, 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6,
81 0x4d, 0x10, 0x1d, 0xdc, 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96,
82 0x5e, 0xc0, 0x62, 0x0b, 0xcf, 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41,
83 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9, 0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d,
84 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8, 0x55, 0xf6, 0x1c, 0x19, 0x0b,
85 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7, 0xaa, 0x0d, 0x14, 0x58,
86 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3, 0xfc, 0x90, 0x7a,
87 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080088};
89
Junxiao Shi81206d52017-07-23 12:43:22 +000090BOOST_AUTO_TEST_CASE(DefaultConstructor)
91{
92 Data d;
93 BOOST_CHECK_EQUAL(d.hasWire(), false);
94 BOOST_CHECK_EQUAL(d.getName(), "/");
95 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
96 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), DEFAULT_FRESHNESS_PERIOD);
Junxiao Shi7d9039b2018-04-14 15:56:28 +000097 BOOST_CHECK(!d.getFinalBlock());
Davide Pesavento81bd6962020-06-17 16:03:23 -040098 BOOST_CHECK_EQUAL(d.hasContent(), false);
99 BOOST_CHECK_EQUAL(d.getContent().isValid(), false);
Junxiao Shi81206d52017-07-23 12:43:22 +0000100 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700101 BOOST_CHECK(!d.getSignatureInfo());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400102 BOOST_CHECK_EQUAL(d.getSignatureType(), -1);
103 BOOST_CHECK(!d.getKeyLocator());
104 BOOST_CHECK_EQUAL(d.getSignatureValue().isValid(), false);
Junxiao Shi81206d52017-07-23 12:43:22 +0000105}
106
107class DataSigningKeyFixture
108{
109protected:
110 DataSigningKeyFixture()
111 {
Davide Pesavento765abc92021-12-27 00:44:04 -0500112 m_privKey.loadPkcs1(PRIVATE_KEY_DER);
Junxiao Shi81206d52017-07-23 12:43:22 +0000113 auto buf = m_privKey.derivePublicKey();
Davide Pesavento765abc92021-12-27 00:44:04 -0500114 m_pubKey.loadPkcs8(*buf);
Junxiao Shi81206d52017-07-23 12:43:22 +0000115 }
116
117protected:
118 security::transform::PrivateKey m_privKey;
119 security::transform::PublicKey m_pubKey;
120
121private:
Davide Pesavento05ec0be2023-03-14 21:18:06 -0400122 static constexpr uint8_t PRIVATE_KEY_DER[] = {
123 0x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
124 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82, 0x02, 0x5a, 0x02, 0x01,
125 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e, 0x47, 0x85, 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47,
126 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05, 0x3a, 0x24, 0x1e, 0xeb, 0x89, 0x01, 0xbb, 0xe9,
127 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68, 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7,
128 0x06, 0x90, 0x9c, 0xaa, 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3,
129 0x1b, 0x88, 0x9a, 0x97, 0x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82,
130 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d, 0x24, 0xc2, 0x63, 0xf3, 0x97, 0x17, 0xeb, 0xfe,
131 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f, 0xb8, 0xf2, 0xf1, 0xc5,
132 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed, 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76,
133 0x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11, 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0,
134 0x2a, 0xe3, 0x6b, 0x0c, 0x8b, 0x73, 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c,
135 0x5b, 0x43, 0x29, 0xad, 0x3a, 0x3b, 0x93, 0xa3, 0x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e,
136 0x33, 0x3f, 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44, 0x00, 0xde, 0x72, 0xed,
137 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2, 0x69, 0x1f,
138 0xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13, 0x06, 0x69, 0x06, 0xd8,
139 0x3f, 0x22, 0x15, 0x75, 0xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66, 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2,
140 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37, 0x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88,
141 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f, 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02, 0x41, 0x00, 0xb6, 0x2e,
142 0xbb, 0xcd, 0x2f, 0x3a, 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e,
143 0x64, 0xa7, 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae,
144 0xb0, 0x74, 0xa6, 0x99, 0xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e, 0x56, 0xad,
145 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c, 0xb7, 0x9a, 0x3e, 0x99, 0xef, 0xb9, 0x02, 0x41,
146 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1, 0xac, 0xee, 0xcb, 0x41, 0x81, 0xc6,
147 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21, 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96,
148 0x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8, 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6,
149 0x90, 0xb5, 0xce, 0x1b, 0x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a,
150 0x7f, 0x02, 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0, 0x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89,
151 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee, 0x51, 0x57, 0xd5, 0x97,
152 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e, 0x88, 0x63, 0xe2, 0x66,
153 0x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a, 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca,
154 0x78, 0xab, 0x21, 0x02, 0x41, 0x00, 0x8f, 0xae, 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24,
155 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81, 0xbc, 0x2c, 0x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d,
156 0x28, 0xd9, 0x10, 0x1a, 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14, 0xbf, 0xc9, 0xff, 0x17,
157 0xd6, 0x47, 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
158 0xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a, 0x33, 0x2f,
159 0x4b, 0xa2, 0xbd, 0xd1, 0xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15, 0x37, 0x1b, 0xde, 0x76,
160 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9, 0x4f, 0x35, 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95,
161 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21, 0x6d, 0xa0, 0x84, 0x39, 0xe9, 0x2e, 0x1e, 0xfc,
162 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d, 0x0a, 0xb6,
163 };
Junxiao Shi81206d52017-07-23 12:43:22 +0000164};
165
Davide Pesavento905d40f2020-06-09 21:33:25 -0400166BOOST_AUTO_TEST_SUITE(Encode)
167
168BOOST_AUTO_TEST_CASE(NotSigned)
Junxiao Shi81206d52017-07-23 12:43:22 +0000169{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400170 Data d;
171 BOOST_CHECK_EXCEPTION(d.wireEncode(), tlv::Error, [] (const auto& e) {
172 return e.what() == "Requested wire format, but Data has not been signed"s;
173 });
174}
175
176BOOST_AUTO_TEST_CASE(Minimal)
177{
178 Data d;
179 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
180 d.setSignatureValue(std::make_shared<Buffer>());
Davide Pesavento81bd6962020-06-17 16:03:23 -0400181 BOOST_CHECK_EQUAL(d.wireEncode(), "060B 0700 1400 16031B0100 1700"_block);
Davide Pesavento905d40f2020-06-09 21:33:25 -0400182}
183
184BOOST_FIXTURE_TEST_CASE(Full, DataSigningKeyFixture)
185{
186 Data d("/local/ndn/prefix");
Junxiao Shi81206d52017-07-23 12:43:22 +0000187 d.setContentType(tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500188 d.setFreshnessPeriod(10_s);
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500189 d.setContent(CONTENT1);
Junxiao Shi81206d52017-07-23 12:43:22 +0000190
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400191 SignatureInfo signatureInfo;
192 signatureInfo.setSignatureType(tlv::SignatureSha256WithRsa);
193 signatureInfo.setKeyLocator(Name("/test/key/locator"));
194 d.setSignatureInfo(signatureInfo);
Junxiao Shi81206d52017-07-23 12:43:22 +0000195
196 OBufferStream sig;
197 {
198 namespace tr = security::transform;
199
200 tr::StepSource input;
201 input >> tr::signerFilter(DigestAlgorithm::SHA256, m_privKey) >> tr::streamSink(sig);
202
Davide Pesavento258d51a2022-02-27 21:26:28 -0500203 input.write(d.getName().wireEncode());
204 input.write(d.getMetaInfo().wireEncode());
205 input.write(d.getContent());
206 input.write(signatureInfo.wireEncode());
Junxiao Shi81206d52017-07-23 12:43:22 +0000207 input.end();
208 }
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400209 d.setSignatureValue(sig.buf());
Junxiao Shi81206d52017-07-23 12:43:22 +0000210
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500211 BOOST_TEST(d.wireEncode() == DATA1, boost::test_tools::per_element());
Junxiao Shi81206d52017-07-23 12:43:22 +0000212}
213
Davide Pesavento905d40f2020-06-09 21:33:25 -0400214BOOST_AUTO_TEST_SUITE_END() // Encode
Junxiao Shi81206d52017-07-23 12:43:22 +0000215
Davide Pesavento905d40f2020-06-09 21:33:25 -0400216class DecodeFixture
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000217{
218protected:
Davide Pesavento905d40f2020-06-09 21:33:25 -0400219 DecodeFixture()
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000220 {
221 // initialize all elements to non-empty, to verify wireDecode clears them
222 d.setName("/A");
223 d.setContentType(tlv::ContentType_Key);
Davide Pesavento905d40f2020-06-09 21:33:25 -0400224 d.setFreshnessPeriod(123_s);
225 d.setFinalBlock(name::Component::fromNumber(42));
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000226 d.setContent("1504C0C1C2C3"_block);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700227 d.setSignatureInfo(SignatureInfo("160A 1B0101 1C050703080142"_block));
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400228 d.setSignatureValue(fromHex("B48F1707A3BCA3CFC5F32DE51D9B46C32D7D262A21544EBDA88C3B415D637503"
229 "FC9BEF20F88202A56AF9831E0D30205FD4154B08502BCDEE860267A5C3E03D8E"
230 "A6CB74BE391C01E0A57B991B4404FC11B7D777F1B700A4B65F201118CF1840A8"
231 "30A2A7C17DB4B7A8777E58515121AF9E2498627F8475414CDFD9801B8152AD5B"));
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000232 }
233
234protected:
235 Data d;
236};
237
Davide Pesavento905d40f2020-06-09 21:33:25 -0400238BOOST_FIXTURE_TEST_SUITE(Decode, DecodeFixture)
239
240BOOST_AUTO_TEST_CASE(NotData)
241{
242 BOOST_CHECK_EXCEPTION(d.wireDecode("4202CAFE"_block), tlv::Error, [] (const auto& e) {
243 return e.what() == "Expecting Data element, but TLV has type 66"s;
244 });
245}
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000246
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000247BOOST_AUTO_TEST_CASE(Minimal)
248{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400249 d.wireDecode("062C 0703(080144) 1603(1B0100) "
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000250 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
251 BOOST_CHECK_EQUAL(d.getName(), "/D");
Davide Pesaventoef654dd2019-07-18 20:02:44 -0400252 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
253 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
254 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400255 BOOST_CHECK_EQUAL(d.hasContent(), false);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000256 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400257 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::DigestSha256);
258 BOOST_CHECK_EQUAL(d.getKeyLocator().has_value(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700259 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 32);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000260
261 // encode without modification: retain original wire encoding
Davide Pesavento905d40f2020-06-09 21:33:25 -0400262 BOOST_CHECK_EQUAL(d.hasWire(), true);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000263 BOOST_CHECK_EQUAL(d.wireEncode().value_size(), 44);
264
Davide Pesavento905d40f2020-06-09 21:33:25 -0400265 // modify then re-encode
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000266 d.setName("/E");
Davide Pesavento905d40f2020-06-09 21:33:25 -0400267 BOOST_CHECK_EQUAL(d.hasWire(), false);
Junxiao Shi72c0c642018-04-20 15:41:09 +0000268 BOOST_CHECK_EQUAL(d.wireEncode(),
Davide Pesavento81bd6962020-06-17 16:03:23 -0400269 "062E 0703(080145) 1400 1603(1B0100) "
Davide Pesavento905d40f2020-06-09 21:33:25 -0400270 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000271}
272
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700273BOOST_AUTO_TEST_CASE(MinimalEmptyName)
274{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400275 d.wireDecode("0609 0700 1603(1B0100) 1700"_block);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700276 BOOST_CHECK_EQUAL(d.getName(), "/"); // empty Name is allowed in Data
277 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
278 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
279 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400280 BOOST_CHECK_EQUAL(d.hasContent(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700281 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400282 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::DigestSha256);
283 BOOST_CHECK_EQUAL(d.getKeyLocator().has_value(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700284 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 0);
285}
286
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000287BOOST_AUTO_TEST_CASE(Full)
288{
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500289 d.wireDecode(Block(DATA1));
Davide Pesavento905d40f2020-06-09 21:33:25 -0400290 BOOST_CHECK_EQUAL(d.getName(), "/local/ndn/prefix");
291 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
292 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 10_s);
293 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400294 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento258d51a2022-02-27 21:26:28 -0500295 BOOST_CHECK_EQUAL(readString(d.getContent()), "SUCCESS!");
Davide Pesavento905d40f2020-06-09 21:33:25 -0400296 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::SignatureSha256WithRsa);
297 BOOST_REQUIRE(d.getKeyLocator().has_value());
298 BOOST_CHECK_EQUAL(d.getKeyLocator()->getName(), "/test/key/locator");
299 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 128);
300}
301
302BOOST_AUTO_TEST_CASE(UnrecognizedNonCriticalElements)
303{
304 d.wireDecode("063A 0703(080144) FC00 1400 FC00 1500 FC00 1603(1B0100) FC00 "
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000305 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 FC00"_block);
306 BOOST_CHECK_EQUAL(d.getName(), "/D");
Davide Pesaventoef654dd2019-07-18 20:02:44 -0400307 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
308 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
309 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400310 BOOST_CHECK_EQUAL(d.hasContent(), true);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000311 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400312 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::DigestSha256);
313 BOOST_CHECK_EQUAL(d.getKeyLocator().has_value(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700314 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 32);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000315
316 // encode without modification: retain original wire encoding
Davide Pesavento905d40f2020-06-09 21:33:25 -0400317 BOOST_CHECK_EQUAL(d.hasWire(), true);
Junxiao Shi8b753a22018-10-24 01:51:40 +0000318 BOOST_CHECK_EQUAL(d.wireEncode().value_size(), 58);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000319
Davide Pesavento905d40f2020-06-09 21:33:25 -0400320 // modify then re-encode
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000321 d.setName("/E");
Davide Pesavento905d40f2020-06-09 21:33:25 -0400322 BOOST_CHECK_EQUAL(d.hasWire(), false);
Junxiao Shi72c0c642018-04-20 15:41:09 +0000323 BOOST_CHECK_EQUAL(d.wireEncode(),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400324 "0630 0703080145 1400 1500 16031B0100 "
325 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000326}
327
328BOOST_AUTO_TEST_CASE(CriticalElementOutOfOrder)
329{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400330 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000331 "0630 1400 0703080145 1500 16031B0100 "
332 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400333 tlv::Error,
334 [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
335 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000336 "0630 0703080145 1500 1400 16031B0100 "
337 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400338 tlv::Error,
339 [] (const auto& e) { return e.what() == "MetaInfo element is out of order"s; });
340 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000341 "0630 0703080145 1400 16031B0100 1500 "
342 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400343 tlv::Error,
344 [] (const auto& e) { return e.what() == "Content element is out of order"s; });
345 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000346 "0630 0703080145 1400 1500 "
347 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 16031B0100"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400348 tlv::Error,
349 [] (const auto& e) { return e.what() == "SignatureInfo element is out of order"s; });
350 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000351 "0652 0703080145 1400 1500 16031B0100 "
352 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"
353 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400354 tlv::Error,
355 [] (const auto& e) { return e.what() == "SignatureValue element is out of order"s; });
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000356}
357
Davide Pesavento905d40f2020-06-09 21:33:25 -0400358BOOST_AUTO_TEST_CASE(MissingName)
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000359{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400360 BOOST_CHECK_EXCEPTION(d.wireDecode("0607 16031B0100 1700"_block), tlv::Error,
361 [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000362}
363
Davide Pesavento905d40f2020-06-09 21:33:25 -0400364BOOST_AUTO_TEST_CASE(MissingSignatureInfo)
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000365{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400366 BOOST_CHECK_EXCEPTION(d.wireDecode("0607 0703080144 1700"_block), tlv::Error,
367 [] (const auto& e) { return e.what() == "SignatureInfo element is missing"s; });
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700368}
369
Davide Pesavento905d40f2020-06-09 21:33:25 -0400370BOOST_AUTO_TEST_CASE(MissingSignatureValue)
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700371{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400372 BOOST_CHECK_EXCEPTION(d.wireDecode("0607 0700 16031B0100"_block), tlv::Error,
373 [] (const auto& e) { return e.what() == "SignatureValue element is missing"s; });
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000374}
375
Junxiao Shi8b753a22018-10-24 01:51:40 +0000376BOOST_AUTO_TEST_CASE(UnrecognizedNonCriticalElementBeforeName)
377{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400378 BOOST_CHECK_EXCEPTION(d.wireDecode(
379 "062E FC00 0703080144 16031B0100 "
380 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
381 tlv::Error,
382 [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
Junxiao Shi8b753a22018-10-24 01:51:40 +0000383}
384
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000385BOOST_AUTO_TEST_CASE(UnrecognizedCriticalElement)
386{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400387 BOOST_CHECK_EXCEPTION(d.wireDecode(
388 "0632 0703080145 FB00 1400 1500 16031B0100 "
389 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
390 tlv::Error,
391 [] (const auto& e) { return e.what() == "Unrecognized element of critical type 251"s; });
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000392}
393
Davide Pesavento905d40f2020-06-09 21:33:25 -0400394BOOST_AUTO_TEST_SUITE_END() // Decode
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000395
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -0500396BOOST_FIXTURE_TEST_CASE(FullName, KeyChainFixture)
Junxiao Shi81206d52017-07-23 12:43:22 +0000397{
398 Data d(Name("/local/ndn/prefix"));
399 d.setContentType(tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500400 d.setFreshnessPeriod(10_s);
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500401 d.setContent(CONTENT1);
Junxiao Shi81206d52017-07-23 12:43:22 +0000402 BOOST_CHECK_THROW(d.getFullName(), Data::Error); // FullName is unavailable without signing
403
404 m_keyChain.sign(d);
405 BOOST_CHECK_EQUAL(d.hasWire(), true);
406 Name fullName = d.getFullName(); // FullName is available after signing
407
408 BOOST_CHECK_EQUAL(d.getName().size() + 1, fullName.size());
409 BOOST_CHECK_EQUAL_COLLECTIONS(d.getName().begin(), d.getName().end(),
410 fullName.begin(), fullName.end() - 1);
411 BOOST_CHECK_EQUAL(fullName.get(-1).value_size(), util::Sha256::DIGEST_SIZE);
412
413 // FullName should be cached, so value() pointer points to same memory location
414 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
415
Davide Pesavento0f830802018-01-16 23:58:58 -0500416 d.setFreshnessPeriod(100_s); // invalidates FullName
Junxiao Shi81206d52017-07-23 12:43:22 +0000417 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
418
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500419 Data d1(Block{DATA1});
Junxiao Shi81206d52017-07-23 12:43:22 +0000420 BOOST_CHECK_EQUAL(d1.getFullName(),
421 "/local/ndn/prefix/"
422 "sha256digest=28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548");
423}
424
Davide Pesavento905d40f2020-06-09 21:33:25 -0400425BOOST_AUTO_TEST_CASE(SetName)
426{
427 Data d;
428 d.setName("/first");
429 BOOST_CHECK_EQUAL(d.getName(), "/first");
430 BOOST_CHECK_EQUAL(d.hasWire(), false);
431
432 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
433 d.setSignatureValue(std::make_shared<Buffer>());
434 d.wireEncode();
435 BOOST_CHECK_EQUAL(d.hasWire(), true);
436 d.setName("/first");
437 BOOST_CHECK_EQUAL(d.getName(), "/first");
438 BOOST_CHECK_EQUAL(d.hasWire(), true);
439
440 d.setName("/second");
441 BOOST_CHECK_EQUAL(d.getName(), "/second");
442 BOOST_CHECK_EQUAL(d.hasWire(), false);
443}
444
445BOOST_AUTO_TEST_CASE(SetContentType)
446{
447 Data d;
448 d.setContentType(tlv::ContentType_Key);
449 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Key);
450 BOOST_CHECK_EQUAL(d.hasWire(), false);
451
452 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
453 d.setSignatureValue(std::make_shared<Buffer>());
454 d.wireEncode();
455 BOOST_CHECK_EQUAL(d.hasWire(), true);
456 d.setContentType(tlv::ContentType_Key);
457 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Key);
458 BOOST_CHECK_EQUAL(d.hasWire(), true);
459
460 d.setContentType(tlv::ContentType_PrefixAnn);
461 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_PrefixAnn);
462 BOOST_CHECK_EQUAL(d.hasWire(), false);
463}
464
465BOOST_AUTO_TEST_CASE(SetFreshnessPeriod)
466{
467 Data d;
468 d.setFreshnessPeriod(15_min);
469 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 15_min);
470 BOOST_CHECK_EQUAL(d.hasWire(), false);
471
472 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
473 d.setSignatureValue(std::make_shared<Buffer>());
474 d.wireEncode();
475 BOOST_CHECK_EQUAL(d.hasWire(), true);
476 d.setFreshnessPeriod(15_min);
477 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 15_min);
478 BOOST_CHECK_EQUAL(d.hasWire(), true);
479
480 d.setFreshnessPeriod(1_h);
481 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 1_h);
482 BOOST_CHECK_EQUAL(d.hasWire(), false);
483}
484
485BOOST_AUTO_TEST_CASE(SetFinalBlock)
486{
487 Data d;
488 d.setFinalBlock(name::Component("foo"));
489 BOOST_CHECK(d.getFinalBlock() == name::Component("foo"));
490 BOOST_CHECK_EQUAL(d.hasWire(), false);
491
492 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
493 d.setSignatureValue(std::make_shared<Buffer>());
494 d.wireEncode();
495 BOOST_CHECK_EQUAL(d.hasWire(), true);
496 d.setFinalBlock(name::Component("foo"));
497 BOOST_CHECK(d.getFinalBlock() == name::Component("foo"));
498 BOOST_CHECK_EQUAL(d.hasWire(), true);
499
500 d.setFinalBlock(name::Component("bar"));
501 BOOST_CHECK(d.getFinalBlock() == name::Component("bar"));
502 BOOST_CHECK_EQUAL(d.hasWire(), false);
503}
504
505BOOST_AUTO_TEST_CASE(SetContent)
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400506{
507 Data d;
Davide Pesavento81bd6962020-06-17 16:03:23 -0400508 BOOST_CHECK_EQUAL(d.hasContent(), false);
509 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Invalid);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400510 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
511
Davide Pesavento81bd6962020-06-17 16:03:23 -0400512 // Block overload, used directly as Content
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400513 const uint8_t direct[] = {0xca, 0xfe};
Davide Pesavento81bd6962020-06-17 16:03:23 -0400514 d.setContent("1502CAFE"_block);
515 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() == direct, boost::test_tools::per_element());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400518
Davide Pesavento81bd6962020-06-17 16:03:23 -0400519 // Block overload, nested inside Content element
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400520 const uint8_t nested[] = {0x99, 0x02, 0xca, 0xfe};
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500521 d.setContent(Block(nested));
Davide Pesavento81bd6962020-06-17 16:03:23 -0400522 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400523 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400524 BOOST_TEST(d.getContent().value_bytes() == nested, boost::test_tools::per_element());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400525
Davide Pesavento81bd6962020-06-17 16:03:23 -0400526 // Block overload, default constructed (invalid)
527 BOOST_CHECK_THROW(d.setContent(Block{}), std::invalid_argument);
528
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500529 // span overload
530 d.setContent(nested);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400531 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400532 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400533 BOOST_TEST(d.getContent().value_bytes() == nested, boost::test_tools::per_element());
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500534 d.setContent(span<uint8_t>{});
Davide Pesavento81bd6962020-06-17 16:03:23 -0400535 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400536 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
537 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500538
Davide Pesavento81bd6962020-06-17 16:03:23 -0400539 // ConstBufferPtr overload
540 d.setContent(std::make_shared<Buffer>(direct, sizeof(direct)));
541 BOOST_CHECK_EQUAL(d.hasContent(), true);
542 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400543 BOOST_TEST(d.getContent().value_bytes() == direct, boost::test_tools::per_element());
Davide Pesavento81bd6962020-06-17 16:03:23 -0400544 d.setContent(std::make_shared<Buffer>());
545 BOOST_CHECK_EQUAL(d.hasContent(), true);
546 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
547 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400548 BOOST_CHECK_THROW(d.setContent(nullptr), std::invalid_argument);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400549
550 // unset
551 d.unsetContent();
552 BOOST_CHECK_EQUAL(d.hasContent(), false);
553 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Invalid);
554 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400555}
556
Davide Pesavento905d40f2020-06-09 21:33:25 -0400557BOOST_AUTO_TEST_CASE(SetSignatureValue)
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400558{
559 Data d;
560 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::Invalid);
561
Davide Pesavento487e3d32022-05-05 18:06:23 -0400562 // span overload
563 const uint8_t sv1[] = {0xbe, 0xef};
564 d.setSignatureValue(sv1);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400565 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::SignatureValue);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400566 BOOST_TEST(d.getSignatureValue().value_bytes() == sv1, boost::test_tools::per_element());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400567
Davide Pesavento487e3d32022-05-05 18:06:23 -0400568 // ConstBufferPtr overload
569 const uint8_t sv2[] = {0xfa, 0xca, 0xde};
570 d.setSignatureValue(std::make_shared<Buffer>(sv2, sizeof(sv2)));
571 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::SignatureValue);
572 BOOST_TEST(d.getSignatureValue().value_bytes() == sv2, boost::test_tools::per_element());
573 d.setSignatureValue(std::make_shared<Buffer>());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400574 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::SignatureValue);
575 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 0);
576
577 BOOST_CHECK_THROW(d.setSignatureValue(nullptr), std::invalid_argument);
578}
579
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -0500580BOOST_FIXTURE_TEST_CASE(ExtractSignedRanges, KeyChainFixture)
Eric Newberrye36aae12020-08-31 22:23:13 -0700581{
582 Data d1("/test/prefix");
583 m_keyChain.sign(d1);
584 auto ranges1 = d1.extractSignedRanges();
585 BOOST_REQUIRE_EQUAL(ranges1.size(), 1);
586 const Block& wire1 = d1.wireEncode();
587 const auto& sigInfoWire1 = wire1.find(tlv::SignatureInfo);
588 BOOST_REQUIRE(sigInfoWire1 != wire1.elements_end());
Davide Pesavento765abc92021-12-27 00:44:04 -0500589 BOOST_CHECK_EQUAL_COLLECTIONS(ranges1.front().begin(), ranges1.front().end(),
Eric Newberrye36aae12020-08-31 22:23:13 -0700590 wire1.value_begin(), sigInfoWire1->value_end());
591
592 // Test with decoded Data and ensure excludes elements after SignatureValue
593 const uint8_t WIRE[] = {
594 0x06, 0x0B, // Data
595 0x07, 0x00, // Name
596 0x16, 0x03, // SignatureInfo
597 0x1B, 0x01, // SignatureType
598 0x00,
599 0x17, 0x00, // SignatureValue
600 0xAA, 0x00 // Unrecognized non-critical element
601 };
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500602 Data d2(Block{WIRE});
Eric Newberrye36aae12020-08-31 22:23:13 -0700603 auto ranges2 = d2.extractSignedRanges();
604 BOOST_REQUIRE_EQUAL(ranges2.size(), 1);
Davide Pesavento765abc92021-12-27 00:44:04 -0500605 BOOST_CHECK_EQUAL_COLLECTIONS(ranges2.front().begin(), ranges2.front().end(), &WIRE[2], &WIRE[9]);
Eric Newberrye36aae12020-08-31 22:23:13 -0700606}
607
Junxiao Shi81206d52017-07-23 12:43:22 +0000608BOOST_AUTO_TEST_CASE(Equality)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700609{
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700610 Data a;
611 Data b;
612 BOOST_CHECK_EQUAL(a == b, true);
613 BOOST_CHECK_EQUAL(a != b, false);
614
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400615 a.setName("/A");
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700616 BOOST_CHECK_EQUAL(a == b, false);
617 BOOST_CHECK_EQUAL(a != b, true);
618
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400619 b.setName("/B");
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700620 BOOST_CHECK_EQUAL(a == b, false);
621 BOOST_CHECK_EQUAL(a != b, true);
622
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400623 b.setName("/A");
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700624 BOOST_CHECK_EQUAL(a == b, true);
625 BOOST_CHECK_EQUAL(a != b, false);
626
Davide Pesavento0f830802018-01-16 23:58:58 -0500627 a.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700628 BOOST_CHECK_EQUAL(a == b, false);
629 BOOST_CHECK_EQUAL(a != b, true);
630
Davide Pesavento0f830802018-01-16 23:58:58 -0500631 b.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700632 BOOST_CHECK_EQUAL(a == b, true);
633 BOOST_CHECK_EQUAL(a != b, false);
634
635 static const uint8_t someData[] = "someData";
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500636 a.setContent(someData);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700637 BOOST_CHECK_EQUAL(a == b, false);
638 BOOST_CHECK_EQUAL(a != b, true);
639
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500640 b.setContent(someData);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700641 BOOST_CHECK_EQUAL(a == b, true);
642 BOOST_CHECK_EQUAL(a != b, false);
643
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700644 a.setSignatureInfo(SignatureInfo(tlv::SignatureSha256WithRsa));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700645 BOOST_CHECK_EQUAL(a == b, false);
646 BOOST_CHECK_EQUAL(a != b, true);
647
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700648 b.setSignatureInfo(SignatureInfo(tlv::SignatureSha256WithRsa));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700649 BOOST_CHECK_EQUAL(a == b, true);
650 BOOST_CHECK_EQUAL(a != b, false);
651}
652
Junxiao Shi81206d52017-07-23 12:43:22 +0000653BOOST_AUTO_TEST_CASE(Print)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700654{
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500655 Data d1(Block{DATA1});
Davide Pesavento81bd6962020-06-17 16:03:23 -0400656 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(d1),
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700657 "Name: /local/ndn/prefix\n"
Davide Pesavento81bd6962020-06-17 16:03:23 -0400658 "MetaInfo: [ContentType: 0, FreshnessPeriod: 10000 milliseconds]\n"
659 "Content: [8 bytes]\n"
660 "Signature: [type: SignatureSha256WithRsa, length: 128]\n");
661
662 Data d2("/foo");
663 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(d2),
664 "Name: /foo\n"
665 "MetaInfo: [ContentType: 0]\n"
666 "Signature: [type: Unknown(65535), length: 0]\n");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800667}
668
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100669BOOST_AUTO_TEST_SUITE_END() // TestData
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800670
Spyridon Mastorakis429634f2015-02-19 17:35:33 -0800671} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800672} // namespace ndn