blob: 2b59850ef5c2d4dfb1982363f3015e8d3eefcbfa [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 Pesaventoa3d809e2022-02-06 11:55:02 -05003 * Copyright (c) 2013-2022 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"
29#include "ndn-cxx/security/verification-helpers.hpp"
30#include "ndn-cxx/util/sha256.hpp"
Davide Pesavento14c56cd2020-05-21 01:44:03 -040031#include "ndn-cxx/util/string-helper.hpp"
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080032
Davide Pesavento7e780642018-11-24 15:51:34 -050033#include "tests/boost-test.hpp"
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -050034#include "tests/key-chain-fixture.hpp"
Davide Pesavento14c56cd2020-05-21 01:44:03 -040035
Junxiao Shi81206d52017-07-23 12:43:22 +000036#include <boost/lexical_cast.hpp>
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070037
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -080038namespace ndn {
Spyridon Mastorakis429634f2015-02-19 17:35:33 -080039namespace tests {
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080040
41BOOST_AUTO_TEST_SUITE(TestData)
42
Junxiao Shi81206d52017-07-23 12:43:22 +000043const uint8_t CONTENT1[] = {0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21};
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080044
Junxiao Shi81206d52017-07-23 12:43:22 +000045const uint8_t DATA1[] = {
Davide Pesavento14c56cd2020-05-21 01:44:03 -040046 0x06, 0xc5, // Data
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070047 0x07, 0x14, // Name
Davide Pesavento14c56cd2020-05-21 01:44:03 -040048 0x08, 0x05,
49 0x6c, 0x6f, 0x63, 0x61, 0x6c,
50 0x08, 0x03,
51 0x6e, 0x64, 0x6e,
52 0x08, 0x06,
53 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080054 0x14, 0x04, // MetaInfo
Davide Pesavento14c56cd2020-05-21 01:44:03 -040055 0x19, 0x02, // FreshnessPeriod
56 0x27, 0x10,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070057 0x15, 0x08, // Content
Davide Pesavento14c56cd2020-05-21 01:44:03 -040058 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080059 0x16, 0x1b, // SignatureInfo
Davide Pesavento14c56cd2020-05-21 01:44:03 -040060 0x1b, 0x01, // SignatureType
61 0x01,
62 0x1c, 0x16, // KeyLocator
63 0x07, 0x14, // Name
64 0x08, 0x04,
65 0x74, 0x65, 0x73, 0x74,
66 0x08, 0x03,
67 0x6b, 0x65, 0x79,
68 0x08, 0x07,
69 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080070 0x17, 0x80, // SignatureValue
Davide Pesavento14c56cd2020-05-21 01:44:03 -040071 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31,
72 0xec, 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9,
73 0xb3, 0xc6, 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8,
74 0xb3, 0x6a, 0x38, 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6,
75 0x4d, 0x10, 0x1d, 0xdc, 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96,
76 0x5e, 0xc0, 0x62, 0x0b, 0xcf, 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41,
77 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9, 0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d,
78 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8, 0x55, 0xf6, 0x1c, 0x19, 0x0b,
79 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7, 0xaa, 0x0d, 0x14, 0x58,
80 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3, 0xfc, 0x90, 0x7a,
81 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080082};
83
Junxiao Shi81206d52017-07-23 12:43:22 +000084BOOST_AUTO_TEST_CASE(DefaultConstructor)
85{
86 Data d;
87 BOOST_CHECK_EQUAL(d.hasWire(), false);
88 BOOST_CHECK_EQUAL(d.getName(), "/");
89 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
90 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), DEFAULT_FRESHNESS_PERIOD);
Junxiao Shi7d9039b2018-04-14 15:56:28 +000091 BOOST_CHECK(!d.getFinalBlock());
Davide Pesavento81bd6962020-06-17 16:03:23 -040092 BOOST_CHECK_EQUAL(d.hasContent(), false);
93 BOOST_CHECK_EQUAL(d.getContent().isValid(), false);
Junxiao Shi81206d52017-07-23 12:43:22 +000094 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Eric Newberrya3c8bd12020-05-15 17:27:07 -070095 BOOST_CHECK(!d.getSignatureInfo());
Davide Pesavento14c56cd2020-05-21 01:44:03 -040096 BOOST_CHECK_EQUAL(d.getSignatureType(), -1);
97 BOOST_CHECK(!d.getKeyLocator());
98 BOOST_CHECK_EQUAL(d.getSignatureValue().isValid(), false);
Junxiao Shi81206d52017-07-23 12:43:22 +000099}
100
101class DataSigningKeyFixture
102{
103protected:
104 DataSigningKeyFixture()
105 {
Davide Pesavento765abc92021-12-27 00:44:04 -0500106 m_privKey.loadPkcs1(PRIVATE_KEY_DER);
Junxiao Shi81206d52017-07-23 12:43:22 +0000107 auto buf = m_privKey.derivePublicKey();
Davide Pesavento765abc92021-12-27 00:44:04 -0500108 m_pubKey.loadPkcs8(*buf);
Junxiao Shi81206d52017-07-23 12:43:22 +0000109 }
110
111protected:
112 security::transform::PrivateKey m_privKey;
113 security::transform::PublicKey m_pubKey;
114
115private:
116 static const uint8_t PRIVATE_KEY_DER[632];
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800117};
118
Junxiao Shi81206d52017-07-23 12:43:22 +0000119const uint8_t DataSigningKeyFixture::PRIVATE_KEY_DER[] = {
120 0x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
121 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82, 0x02, 0x5a, 0x02, 0x01,
122 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e, 0x47, 0x85, 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47,
123 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05, 0x3a, 0x24, 0x1e, 0xeb, 0x89, 0x01, 0xbb, 0xe9,
124 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68, 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7,
125 0x06, 0x90, 0x9c, 0xaa, 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3,
126 0x1b, 0x88, 0x9a, 0x97, 0x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82,
127 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d, 0x24, 0xc2, 0x63, 0xf3, 0x97, 0x17, 0xeb, 0xfe,
128 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f, 0xb8, 0xf2, 0xf1, 0xc5,
129 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed, 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76,
130 0x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11, 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0,
131 0x2a, 0xe3, 0x6b, 0x0c, 0x8b, 0x73, 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c,
132 0x5b, 0x43, 0x29, 0xad, 0x3a, 0x3b, 0x93, 0xa3, 0x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e,
133 0x33, 0x3f, 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44, 0x00, 0xde, 0x72, 0xed,
134 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2, 0x69, 0x1f,
135 0xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13, 0x06, 0x69, 0x06, 0xd8,
136 0x3f, 0x22, 0x15, 0x75, 0xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66, 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2,
137 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37, 0x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88,
138 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f, 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02, 0x41, 0x00, 0xb6, 0x2e,
139 0xbb, 0xcd, 0x2f, 0x3a, 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e,
140 0x64, 0xa7, 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae,
141 0xb0, 0x74, 0xa6, 0x99, 0xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e, 0x56, 0xad,
142 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c, 0xb7, 0x9a, 0x3e, 0x99, 0xef, 0xb9, 0x02, 0x41,
143 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1, 0xac, 0xee, 0xcb, 0x41, 0x81, 0xc6,
144 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21, 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96,
145 0x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8, 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6,
146 0x90, 0xb5, 0xce, 0x1b, 0x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a,
147 0x7f, 0x02, 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0, 0x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89,
148 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee, 0x51, 0x57, 0xd5, 0x97,
149 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e, 0x88, 0x63, 0xe2, 0x66,
150 0x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a, 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca,
151 0x78, 0xab, 0x21, 0x02, 0x41, 0x00, 0x8f, 0xae, 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24,
152 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81, 0xbc, 0x2c, 0x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d,
153 0x28, 0xd9, 0x10, 0x1a, 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14, 0xbf, 0xc9, 0xff, 0x17,
154 0xd6, 0x47, 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
155 0xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a, 0x33, 0x2f,
156 0x4b, 0xa2, 0xbd, 0xd1, 0xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15, 0x37, 0x1b, 0xde, 0x76,
157 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9, 0x4f, 0x35, 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95,
158 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21, 0x6d, 0xa0, 0x84, 0x39, 0xe9, 0x2e, 0x1e, 0xfc,
159 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d, 0x0a, 0xb6
160};
161
Davide Pesavento905d40f2020-06-09 21:33:25 -0400162BOOST_AUTO_TEST_SUITE(Encode)
163
164BOOST_AUTO_TEST_CASE(NotSigned)
Junxiao Shi81206d52017-07-23 12:43:22 +0000165{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400166 Data d;
167 BOOST_CHECK_EXCEPTION(d.wireEncode(), tlv::Error, [] (const auto& e) {
168 return e.what() == "Requested wire format, but Data has not been signed"s;
169 });
170}
171
172BOOST_AUTO_TEST_CASE(Minimal)
173{
174 Data d;
175 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
176 d.setSignatureValue(std::make_shared<Buffer>());
Davide Pesavento81bd6962020-06-17 16:03:23 -0400177 BOOST_CHECK_EQUAL(d.wireEncode(), "060B 0700 1400 16031B0100 1700"_block);
Davide Pesavento905d40f2020-06-09 21:33:25 -0400178}
179
180BOOST_FIXTURE_TEST_CASE(Full, DataSigningKeyFixture)
181{
182 Data d("/local/ndn/prefix");
Junxiao Shi81206d52017-07-23 12:43:22 +0000183 d.setContentType(tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500184 d.setFreshnessPeriod(10_s);
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500185 d.setContent(CONTENT1);
Junxiao Shi81206d52017-07-23 12:43:22 +0000186
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400187 SignatureInfo signatureInfo;
188 signatureInfo.setSignatureType(tlv::SignatureSha256WithRsa);
189 signatureInfo.setKeyLocator(Name("/test/key/locator"));
190 d.setSignatureInfo(signatureInfo);
Junxiao Shi81206d52017-07-23 12:43:22 +0000191
192 OBufferStream sig;
193 {
194 namespace tr = security::transform;
195
196 tr::StepSource input;
197 input >> tr::signerFilter(DigestAlgorithm::SHA256, m_privKey) >> tr::streamSink(sig);
198
Davide Pesavento258d51a2022-02-27 21:26:28 -0500199 input.write(d.getName().wireEncode());
200 input.write(d.getMetaInfo().wireEncode());
201 input.write(d.getContent());
202 input.write(signatureInfo.wireEncode());
Junxiao Shi81206d52017-07-23 12:43:22 +0000203 input.end();
204 }
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400205 d.setSignatureValue(sig.buf());
Junxiao Shi81206d52017-07-23 12:43:22 +0000206
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500207 BOOST_TEST(d.wireEncode() == DATA1, boost::test_tools::per_element());
Junxiao Shi81206d52017-07-23 12:43:22 +0000208}
209
Davide Pesavento905d40f2020-06-09 21:33:25 -0400210BOOST_AUTO_TEST_SUITE_END() // Encode
Junxiao Shi81206d52017-07-23 12:43:22 +0000211
Davide Pesavento905d40f2020-06-09 21:33:25 -0400212class DecodeFixture
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000213{
214protected:
Davide Pesavento905d40f2020-06-09 21:33:25 -0400215 DecodeFixture()
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000216 {
217 // initialize all elements to non-empty, to verify wireDecode clears them
218 d.setName("/A");
219 d.setContentType(tlv::ContentType_Key);
Davide Pesavento905d40f2020-06-09 21:33:25 -0400220 d.setFreshnessPeriod(123_s);
221 d.setFinalBlock(name::Component::fromNumber(42));
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000222 d.setContent("1504C0C1C2C3"_block);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700223 d.setSignatureInfo(SignatureInfo("160A 1B0101 1C050703080142"_block));
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400224 d.setSignatureValue(fromHex("B48F1707A3BCA3CFC5F32DE51D9B46C32D7D262A21544EBDA88C3B415D637503"
225 "FC9BEF20F88202A56AF9831E0D30205FD4154B08502BCDEE860267A5C3E03D8E"
226 "A6CB74BE391C01E0A57B991B4404FC11B7D777F1B700A4B65F201118CF1840A8"
227 "30A2A7C17DB4B7A8777E58515121AF9E2498627F8475414CDFD9801B8152AD5B"));
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000228 }
229
230protected:
231 Data d;
232};
233
Davide Pesavento905d40f2020-06-09 21:33:25 -0400234BOOST_FIXTURE_TEST_SUITE(Decode, DecodeFixture)
235
236BOOST_AUTO_TEST_CASE(NotData)
237{
238 BOOST_CHECK_EXCEPTION(d.wireDecode("4202CAFE"_block), tlv::Error, [] (const auto& e) {
239 return e.what() == "Expecting Data element, but TLV has type 66"s;
240 });
241}
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000242
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000243BOOST_AUTO_TEST_CASE(Minimal)
244{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400245 d.wireDecode("062C 0703(080144) 1603(1B0100) "
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000246 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
247 BOOST_CHECK_EQUAL(d.getName(), "/D");
Davide Pesaventoef654dd2019-07-18 20:02:44 -0400248 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
249 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
250 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400251 BOOST_CHECK_EQUAL(d.hasContent(), false);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000252 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400253 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::DigestSha256);
254 BOOST_CHECK_EQUAL(d.getKeyLocator().has_value(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700255 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 32);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000256
257 // encode without modification: retain original wire encoding
Davide Pesavento905d40f2020-06-09 21:33:25 -0400258 BOOST_CHECK_EQUAL(d.hasWire(), true);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000259 BOOST_CHECK_EQUAL(d.wireEncode().value_size(), 44);
260
Davide Pesavento905d40f2020-06-09 21:33:25 -0400261 // modify then re-encode
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000262 d.setName("/E");
Davide Pesavento905d40f2020-06-09 21:33:25 -0400263 BOOST_CHECK_EQUAL(d.hasWire(), false);
Junxiao Shi72c0c642018-04-20 15:41:09 +0000264 BOOST_CHECK_EQUAL(d.wireEncode(),
Davide Pesavento81bd6962020-06-17 16:03:23 -0400265 "062E 0703(080145) 1400 1603(1B0100) "
Davide Pesavento905d40f2020-06-09 21:33:25 -0400266 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000267}
268
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700269BOOST_AUTO_TEST_CASE(MinimalEmptyName)
270{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400271 d.wireDecode("0609 0700 1603(1B0100) 1700"_block);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700272 BOOST_CHECK_EQUAL(d.getName(), "/"); // empty Name is allowed in Data
273 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
274 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
275 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400276 BOOST_CHECK_EQUAL(d.hasContent(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700277 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400278 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::DigestSha256);
279 BOOST_CHECK_EQUAL(d.getKeyLocator().has_value(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700280 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 0);
281}
282
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000283BOOST_AUTO_TEST_CASE(Full)
284{
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500285 d.wireDecode(Block(DATA1));
Davide Pesavento905d40f2020-06-09 21:33:25 -0400286 BOOST_CHECK_EQUAL(d.getName(), "/local/ndn/prefix");
287 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
288 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 10_s);
289 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400290 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento258d51a2022-02-27 21:26:28 -0500291 BOOST_CHECK_EQUAL(readString(d.getContent()), "SUCCESS!");
Davide Pesavento905d40f2020-06-09 21:33:25 -0400292 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::SignatureSha256WithRsa);
293 BOOST_REQUIRE(d.getKeyLocator().has_value());
294 BOOST_CHECK_EQUAL(d.getKeyLocator()->getName(), "/test/key/locator");
295 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 128);
296}
297
298BOOST_AUTO_TEST_CASE(UnrecognizedNonCriticalElements)
299{
300 d.wireDecode("063A 0703(080144) FC00 1400 FC00 1500 FC00 1603(1B0100) FC00 "
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000301 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 FC00"_block);
302 BOOST_CHECK_EQUAL(d.getName(), "/D");
Davide Pesaventoef654dd2019-07-18 20:02:44 -0400303 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
304 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
305 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400306 BOOST_CHECK_EQUAL(d.hasContent(), true);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000307 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400308 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::DigestSha256);
309 BOOST_CHECK_EQUAL(d.getKeyLocator().has_value(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700310 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 32);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000311
312 // encode without modification: retain original wire encoding
Davide Pesavento905d40f2020-06-09 21:33:25 -0400313 BOOST_CHECK_EQUAL(d.hasWire(), true);
Junxiao Shi8b753a22018-10-24 01:51:40 +0000314 BOOST_CHECK_EQUAL(d.wireEncode().value_size(), 58);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000315
Davide Pesavento905d40f2020-06-09 21:33:25 -0400316 // modify then re-encode
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000317 d.setName("/E");
Davide Pesavento905d40f2020-06-09 21:33:25 -0400318 BOOST_CHECK_EQUAL(d.hasWire(), false);
Junxiao Shi72c0c642018-04-20 15:41:09 +0000319 BOOST_CHECK_EQUAL(d.wireEncode(),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400320 "0630 0703080145 1400 1500 16031B0100 "
321 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000322}
323
324BOOST_AUTO_TEST_CASE(CriticalElementOutOfOrder)
325{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400326 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000327 "0630 1400 0703080145 1500 16031B0100 "
328 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400329 tlv::Error,
330 [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
331 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000332 "0630 0703080145 1500 1400 16031B0100 "
333 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400334 tlv::Error,
335 [] (const auto& e) { return e.what() == "MetaInfo element is out of order"s; });
336 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000337 "0630 0703080145 1400 16031B0100 1500 "
338 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400339 tlv::Error,
340 [] (const auto& e) { return e.what() == "Content element is out of order"s; });
341 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000342 "0630 0703080145 1400 1500 "
343 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 16031B0100"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400344 tlv::Error,
345 [] (const auto& e) { return e.what() == "SignatureInfo element is out of order"s; });
346 BOOST_CHECK_EXCEPTION(d.wireDecode(
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000347 "0652 0703080145 1400 1500 16031B0100 "
348 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"
349 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
Davide Pesavento905d40f2020-06-09 21:33:25 -0400350 tlv::Error,
351 [] (const auto& e) { return e.what() == "SignatureValue element is out of order"s; });
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000352}
353
Davide Pesavento905d40f2020-06-09 21:33:25 -0400354BOOST_AUTO_TEST_CASE(MissingName)
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000355{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400356 BOOST_CHECK_EXCEPTION(d.wireDecode("0607 16031B0100 1700"_block), tlv::Error,
357 [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000358}
359
Davide Pesavento905d40f2020-06-09 21:33:25 -0400360BOOST_AUTO_TEST_CASE(MissingSignatureInfo)
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000361{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400362 BOOST_CHECK_EXCEPTION(d.wireDecode("0607 0703080144 1700"_block), tlv::Error,
363 [] (const auto& e) { return e.what() == "SignatureInfo element is missing"s; });
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700364}
365
Davide Pesavento905d40f2020-06-09 21:33:25 -0400366BOOST_AUTO_TEST_CASE(MissingSignatureValue)
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700367{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400368 BOOST_CHECK_EXCEPTION(d.wireDecode("0607 0700 16031B0100"_block), tlv::Error,
369 [] (const auto& e) { return e.what() == "SignatureValue element is missing"s; });
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000370}
371
Junxiao Shi8b753a22018-10-24 01:51:40 +0000372BOOST_AUTO_TEST_CASE(UnrecognizedNonCriticalElementBeforeName)
373{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400374 BOOST_CHECK_EXCEPTION(d.wireDecode(
375 "062E FC00 0703080144 16031B0100 "
376 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
377 tlv::Error,
378 [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
Junxiao Shi8b753a22018-10-24 01:51:40 +0000379}
380
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000381BOOST_AUTO_TEST_CASE(UnrecognizedCriticalElement)
382{
Davide Pesavento905d40f2020-06-09 21:33:25 -0400383 BOOST_CHECK_EXCEPTION(d.wireDecode(
384 "0632 0703080145 FB00 1400 1500 16031B0100 "
385 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
386 tlv::Error,
387 [] (const auto& e) { return e.what() == "Unrecognized element of critical type 251"s; });
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000388}
389
Davide Pesavento905d40f2020-06-09 21:33:25 -0400390BOOST_AUTO_TEST_SUITE_END() // Decode
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000391
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -0500392BOOST_FIXTURE_TEST_CASE(FullName, KeyChainFixture)
Junxiao Shi81206d52017-07-23 12:43:22 +0000393{
394 Data d(Name("/local/ndn/prefix"));
395 d.setContentType(tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500396 d.setFreshnessPeriod(10_s);
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500397 d.setContent(CONTENT1);
Junxiao Shi81206d52017-07-23 12:43:22 +0000398 BOOST_CHECK_THROW(d.getFullName(), Data::Error); // FullName is unavailable without signing
399
400 m_keyChain.sign(d);
401 BOOST_CHECK_EQUAL(d.hasWire(), true);
402 Name fullName = d.getFullName(); // FullName is available after signing
403
404 BOOST_CHECK_EQUAL(d.getName().size() + 1, fullName.size());
405 BOOST_CHECK_EQUAL_COLLECTIONS(d.getName().begin(), d.getName().end(),
406 fullName.begin(), fullName.end() - 1);
407 BOOST_CHECK_EQUAL(fullName.get(-1).value_size(), util::Sha256::DIGEST_SIZE);
408
409 // FullName should be cached, so value() pointer points to same memory location
410 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
411
Davide Pesavento0f830802018-01-16 23:58:58 -0500412 d.setFreshnessPeriod(100_s); // invalidates FullName
Junxiao Shi81206d52017-07-23 12:43:22 +0000413 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
414
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500415 Data d1(Block{DATA1});
Junxiao Shi81206d52017-07-23 12:43:22 +0000416 BOOST_CHECK_EQUAL(d1.getFullName(),
417 "/local/ndn/prefix/"
418 "sha256digest=28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548");
419}
420
Davide Pesavento905d40f2020-06-09 21:33:25 -0400421BOOST_AUTO_TEST_CASE(SetName)
422{
423 Data d;
424 d.setName("/first");
425 BOOST_CHECK_EQUAL(d.getName(), "/first");
426 BOOST_CHECK_EQUAL(d.hasWire(), false);
427
428 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
429 d.setSignatureValue(std::make_shared<Buffer>());
430 d.wireEncode();
431 BOOST_CHECK_EQUAL(d.hasWire(), true);
432 d.setName("/first");
433 BOOST_CHECK_EQUAL(d.getName(), "/first");
434 BOOST_CHECK_EQUAL(d.hasWire(), true);
435
436 d.setName("/second");
437 BOOST_CHECK_EQUAL(d.getName(), "/second");
438 BOOST_CHECK_EQUAL(d.hasWire(), false);
439}
440
441BOOST_AUTO_TEST_CASE(SetContentType)
442{
443 Data d;
444 d.setContentType(tlv::ContentType_Key);
445 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Key);
446 BOOST_CHECK_EQUAL(d.hasWire(), false);
447
448 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
449 d.setSignatureValue(std::make_shared<Buffer>());
450 d.wireEncode();
451 BOOST_CHECK_EQUAL(d.hasWire(), true);
452 d.setContentType(tlv::ContentType_Key);
453 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Key);
454 BOOST_CHECK_EQUAL(d.hasWire(), true);
455
456 d.setContentType(tlv::ContentType_PrefixAnn);
457 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_PrefixAnn);
458 BOOST_CHECK_EQUAL(d.hasWire(), false);
459}
460
461BOOST_AUTO_TEST_CASE(SetFreshnessPeriod)
462{
463 Data d;
464 d.setFreshnessPeriod(15_min);
465 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 15_min);
466 BOOST_CHECK_EQUAL(d.hasWire(), false);
467
468 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
469 d.setSignatureValue(std::make_shared<Buffer>());
470 d.wireEncode();
471 BOOST_CHECK_EQUAL(d.hasWire(), true);
472 d.setFreshnessPeriod(15_min);
473 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 15_min);
474 BOOST_CHECK_EQUAL(d.hasWire(), true);
475
476 d.setFreshnessPeriod(1_h);
477 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 1_h);
478 BOOST_CHECK_EQUAL(d.hasWire(), false);
479}
480
481BOOST_AUTO_TEST_CASE(SetFinalBlock)
482{
483 Data d;
484 d.setFinalBlock(name::Component("foo"));
485 BOOST_CHECK(d.getFinalBlock() == name::Component("foo"));
486 BOOST_CHECK_EQUAL(d.hasWire(), false);
487
488 d.setSignatureInfo(SignatureInfo(tlv::DigestSha256));
489 d.setSignatureValue(std::make_shared<Buffer>());
490 d.wireEncode();
491 BOOST_CHECK_EQUAL(d.hasWire(), true);
492 d.setFinalBlock(name::Component("foo"));
493 BOOST_CHECK(d.getFinalBlock() == name::Component("foo"));
494 BOOST_CHECK_EQUAL(d.hasWire(), true);
495
496 d.setFinalBlock(name::Component("bar"));
497 BOOST_CHECK(d.getFinalBlock() == name::Component("bar"));
498 BOOST_CHECK_EQUAL(d.hasWire(), false);
499}
500
501BOOST_AUTO_TEST_CASE(SetContent)
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400502{
503 Data d;
Davide Pesavento81bd6962020-06-17 16:03:23 -0400504 BOOST_CHECK_EQUAL(d.hasContent(), false);
505 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Invalid);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400506 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
507
Davide Pesavento81bd6962020-06-17 16:03:23 -0400508 // Block overload, used directly as Content
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400509 const uint8_t direct[] = {0xca, 0xfe};
Davide Pesavento81bd6962020-06-17 16:03:23 -0400510 d.setContent("1502CAFE"_block);
511 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400512 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400513 BOOST_TEST(d.getContent().value_bytes() == direct, boost::test_tools::per_element());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400514
Davide Pesavento81bd6962020-06-17 16:03:23 -0400515 // Block overload, nested inside Content element
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400516 const uint8_t nested[] = {0x99, 0x02, 0xca, 0xfe};
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500517 d.setContent(Block(nested));
Davide Pesavento81bd6962020-06-17 16:03:23 -0400518 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400519 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400520 BOOST_TEST(d.getContent().value_bytes() == nested, boost::test_tools::per_element());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400521
Davide Pesavento81bd6962020-06-17 16:03:23 -0400522 // Block overload, default constructed (invalid)
523 BOOST_CHECK_THROW(d.setContent(Block{}), std::invalid_argument);
524
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500525 // span overload
526 d.setContent(nested);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400527 BOOST_CHECK_EQUAL(d.hasContent(), true);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400528 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400529 BOOST_TEST(d.getContent().value_bytes() == nested, boost::test_tools::per_element());
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500530 d.setContent(span<uint8_t>{});
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);
533 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500534
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500535 // raw buffer overload (deprecated)
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500536#pragma GCC diagnostic push
537#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
Davide Pesavento81bd6962020-06-17 16:03:23 -0400538 BOOST_CHECK_THROW(d.setContent(nullptr, 1), std::invalid_argument);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500539#pragma GCC diagnostic pop
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400540
Davide Pesavento81bd6962020-06-17 16:03:23 -0400541 // ConstBufferPtr overload
542 d.setContent(std::make_shared<Buffer>(direct, sizeof(direct)));
543 BOOST_CHECK_EQUAL(d.hasContent(), true);
544 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400545 BOOST_TEST(d.getContent().value_bytes() == direct, boost::test_tools::per_element());
Davide Pesavento81bd6962020-06-17 16:03:23 -0400546 d.setContent(std::make_shared<Buffer>());
547 BOOST_CHECK_EQUAL(d.hasContent(), true);
548 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
549 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400550 BOOST_CHECK_THROW(d.setContent(nullptr), std::invalid_argument);
Davide Pesavento81bd6962020-06-17 16:03:23 -0400551
552 // unset
553 d.unsetContent();
554 BOOST_CHECK_EQUAL(d.hasContent(), false);
555 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Invalid);
556 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400557}
558
Davide Pesavento905d40f2020-06-09 21:33:25 -0400559BOOST_AUTO_TEST_CASE(SetSignatureValue)
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400560{
561 Data d;
562 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::Invalid);
563
Davide Pesavento487e3d32022-05-05 18:06:23 -0400564 // span overload
565 const uint8_t sv1[] = {0xbe, 0xef};
566 d.setSignatureValue(sv1);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400567 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::SignatureValue);
Davide Pesavento487e3d32022-05-05 18:06:23 -0400568 BOOST_TEST(d.getSignatureValue().value_bytes() == sv1, boost::test_tools::per_element());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400569
Davide Pesavento487e3d32022-05-05 18:06:23 -0400570 // ConstBufferPtr overload
571 const uint8_t sv2[] = {0xfa, 0xca, 0xde};
572 d.setSignatureValue(std::make_shared<Buffer>(sv2, sizeof(sv2)));
573 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::SignatureValue);
574 BOOST_TEST(d.getSignatureValue().value_bytes() == sv2, boost::test_tools::per_element());
575 d.setSignatureValue(std::make_shared<Buffer>());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400576 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::SignatureValue);
577 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 0);
578
579 BOOST_CHECK_THROW(d.setSignatureValue(nullptr), std::invalid_argument);
580}
581
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -0500582BOOST_FIXTURE_TEST_CASE(ExtractSignedRanges, KeyChainFixture)
Eric Newberrye36aae12020-08-31 22:23:13 -0700583{
584 Data d1("/test/prefix");
585 m_keyChain.sign(d1);
586 auto ranges1 = d1.extractSignedRanges();
587 BOOST_REQUIRE_EQUAL(ranges1.size(), 1);
588 const Block& wire1 = d1.wireEncode();
589 const auto& sigInfoWire1 = wire1.find(tlv::SignatureInfo);
590 BOOST_REQUIRE(sigInfoWire1 != wire1.elements_end());
Davide Pesavento765abc92021-12-27 00:44:04 -0500591 BOOST_CHECK_EQUAL_COLLECTIONS(ranges1.front().begin(), ranges1.front().end(),
Eric Newberrye36aae12020-08-31 22:23:13 -0700592 wire1.value_begin(), sigInfoWire1->value_end());
593
594 // Test with decoded Data and ensure excludes elements after SignatureValue
595 const uint8_t WIRE[] = {
596 0x06, 0x0B, // Data
597 0x07, 0x00, // Name
598 0x16, 0x03, // SignatureInfo
599 0x1B, 0x01, // SignatureType
600 0x00,
601 0x17, 0x00, // SignatureValue
602 0xAA, 0x00 // Unrecognized non-critical element
603 };
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500604 Data d2(Block{WIRE});
Eric Newberrye36aae12020-08-31 22:23:13 -0700605 auto ranges2 = d2.extractSignedRanges();
606 BOOST_REQUIRE_EQUAL(ranges2.size(), 1);
Davide Pesavento765abc92021-12-27 00:44:04 -0500607 BOOST_CHECK_EQUAL_COLLECTIONS(ranges2.front().begin(), ranges2.front().end(), &WIRE[2], &WIRE[9]);
Eric Newberrye36aae12020-08-31 22:23:13 -0700608}
609
Junxiao Shi81206d52017-07-23 12:43:22 +0000610BOOST_AUTO_TEST_CASE(Equality)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700611{
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700612 Data a;
613 Data b;
614 BOOST_CHECK_EQUAL(a == b, true);
615 BOOST_CHECK_EQUAL(a != b, false);
616
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400617 a.setName("/A");
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700618 BOOST_CHECK_EQUAL(a == b, false);
619 BOOST_CHECK_EQUAL(a != b, true);
620
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400621 b.setName("/B");
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700622 BOOST_CHECK_EQUAL(a == b, false);
623 BOOST_CHECK_EQUAL(a != b, true);
624
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400625 b.setName("/A");
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700626 BOOST_CHECK_EQUAL(a == b, true);
627 BOOST_CHECK_EQUAL(a != b, false);
628
Davide Pesavento0f830802018-01-16 23:58:58 -0500629 a.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700630 BOOST_CHECK_EQUAL(a == b, false);
631 BOOST_CHECK_EQUAL(a != b, true);
632
Davide Pesavento0f830802018-01-16 23:58:58 -0500633 b.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700634 BOOST_CHECK_EQUAL(a == b, true);
635 BOOST_CHECK_EQUAL(a != b, false);
636
637 static const uint8_t someData[] = "someData";
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500638 a.setContent(someData);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700639 BOOST_CHECK_EQUAL(a == b, false);
640 BOOST_CHECK_EQUAL(a != b, true);
641
Davide Pesaventoa3d809e2022-02-06 11:55:02 -0500642 b.setContent(someData);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700643 BOOST_CHECK_EQUAL(a == b, true);
644 BOOST_CHECK_EQUAL(a != b, false);
645
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700646 a.setSignatureInfo(SignatureInfo(tlv::SignatureSha256WithRsa));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700647 BOOST_CHECK_EQUAL(a == b, false);
648 BOOST_CHECK_EQUAL(a != b, true);
649
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700650 b.setSignatureInfo(SignatureInfo(tlv::SignatureSha256WithRsa));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700651 BOOST_CHECK_EQUAL(a == b, true);
652 BOOST_CHECK_EQUAL(a != b, false);
653}
654
Junxiao Shi81206d52017-07-23 12:43:22 +0000655BOOST_AUTO_TEST_CASE(Print)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700656{
Davide Pesaventofbea4fc2022-02-08 07:26:04 -0500657 Data d1(Block{DATA1});
Davide Pesavento81bd6962020-06-17 16:03:23 -0400658 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(d1),
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700659 "Name: /local/ndn/prefix\n"
Davide Pesavento81bd6962020-06-17 16:03:23 -0400660 "MetaInfo: [ContentType: 0, FreshnessPeriod: 10000 milliseconds]\n"
661 "Content: [8 bytes]\n"
662 "Signature: [type: SignatureSha256WithRsa, length: 128]\n");
663
664 Data d2("/foo");
665 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(d2),
666 "Name: /foo\n"
667 "MetaInfo: [ContentType: 0]\n"
668 "Signature: [type: Unknown(65535), length: 0]\n");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800669}
670
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100671BOOST_AUTO_TEST_SUITE_END() // TestData
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800672
Spyridon Mastorakis429634f2015-02-19 17:35:33 -0800673} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800674} // namespace ndn