blob: f741a8243d212d55c21420cbb7d2cbfb1a26132a [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/*
Eric Newberrya3c8bd12020-05-15 17:27:07 -07003 * Copyright (c) 2013-2020 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"
34#include "tests/identity-management-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());
Junxiao Shi81206d52017-07-23 12:43:22 +000092 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
93 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Eric Newberrya3c8bd12020-05-15 17:27:07 -070094 BOOST_CHECK(!d.getSignatureInfo());
Davide Pesavento14c56cd2020-05-21 01:44:03 -040095 BOOST_CHECK_EQUAL(d.getSignatureType(), -1);
96 BOOST_CHECK(!d.getKeyLocator());
97 BOOST_CHECK_EQUAL(d.getSignatureValue().isValid(), false);
Junxiao Shi81206d52017-07-23 12:43:22 +000098}
99
100class DataSigningKeyFixture
101{
102protected:
103 DataSigningKeyFixture()
104 {
105 m_privKey.loadPkcs1(PRIVATE_KEY_DER, sizeof(PRIVATE_KEY_DER));
106 auto buf = m_privKey.derivePublicKey();
107 m_pubKey.loadPkcs8(buf->data(), buf->size());
108 }
109
110protected:
111 security::transform::PrivateKey m_privKey;
112 security::transform::PublicKey m_pubKey;
113
114private:
115 static const uint8_t PRIVATE_KEY_DER[632];
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800116};
117
Junxiao Shi81206d52017-07-23 12:43:22 +0000118const uint8_t DataSigningKeyFixture::PRIVATE_KEY_DER[] = {
119 0x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
120 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82, 0x02, 0x5a, 0x02, 0x01,
121 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e, 0x47, 0x85, 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47,
122 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05, 0x3a, 0x24, 0x1e, 0xeb, 0x89, 0x01, 0xbb, 0xe9,
123 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68, 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7,
124 0x06, 0x90, 0x9c, 0xaa, 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3,
125 0x1b, 0x88, 0x9a, 0x97, 0x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82,
126 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d, 0x24, 0xc2, 0x63, 0xf3, 0x97, 0x17, 0xeb, 0xfe,
127 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f, 0xb8, 0xf2, 0xf1, 0xc5,
128 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed, 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76,
129 0x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11, 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0,
130 0x2a, 0xe3, 0x6b, 0x0c, 0x8b, 0x73, 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c,
131 0x5b, 0x43, 0x29, 0xad, 0x3a, 0x3b, 0x93, 0xa3, 0x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e,
132 0x33, 0x3f, 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44, 0x00, 0xde, 0x72, 0xed,
133 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2, 0x69, 0x1f,
134 0xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13, 0x06, 0x69, 0x06, 0xd8,
135 0x3f, 0x22, 0x15, 0x75, 0xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66, 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2,
136 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37, 0x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88,
137 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f, 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02, 0x41, 0x00, 0xb6, 0x2e,
138 0xbb, 0xcd, 0x2f, 0x3a, 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e,
139 0x64, 0xa7, 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae,
140 0xb0, 0x74, 0xa6, 0x99, 0xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e, 0x56, 0xad,
141 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c, 0xb7, 0x9a, 0x3e, 0x99, 0xef, 0xb9, 0x02, 0x41,
142 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1, 0xac, 0xee, 0xcb, 0x41, 0x81, 0xc6,
143 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21, 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96,
144 0x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8, 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6,
145 0x90, 0xb5, 0xce, 0x1b, 0x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a,
146 0x7f, 0x02, 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0, 0x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89,
147 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee, 0x51, 0x57, 0xd5, 0x97,
148 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e, 0x88, 0x63, 0xe2, 0x66,
149 0x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a, 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca,
150 0x78, 0xab, 0x21, 0x02, 0x41, 0x00, 0x8f, 0xae, 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24,
151 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81, 0xbc, 0x2c, 0x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d,
152 0x28, 0xd9, 0x10, 0x1a, 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14, 0xbf, 0xc9, 0xff, 0x17,
153 0xd6, 0x47, 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
154 0xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a, 0x33, 0x2f,
155 0x4b, 0xa2, 0xbd, 0xd1, 0xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15, 0x37, 0x1b, 0xde, 0x76,
156 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9, 0x4f, 0x35, 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95,
157 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21, 0x6d, 0xa0, 0x84, 0x39, 0xe9, 0x2e, 0x1e, 0xfc,
158 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d, 0x0a, 0xb6
159};
160
161BOOST_FIXTURE_TEST_CASE(Encode, DataSigningKeyFixture)
162{
Junxiao Shi81206d52017-07-23 12:43:22 +0000163 Data d(Name("/local/ndn/prefix"));
164 d.setContentType(tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500165 d.setFreshnessPeriod(10_s);
Junxiao Shi81206d52017-07-23 12:43:22 +0000166 d.setContent(CONTENT1, sizeof(CONTENT1));
167
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400168 SignatureInfo signatureInfo;
169 signatureInfo.setSignatureType(tlv::SignatureSha256WithRsa);
170 signatureInfo.setKeyLocator(Name("/test/key/locator"));
171 d.setSignatureInfo(signatureInfo);
Junxiao Shi81206d52017-07-23 12:43:22 +0000172
173 OBufferStream sig;
174 {
175 namespace tr = security::transform;
176
177 tr::StepSource input;
178 input >> tr::signerFilter(DigestAlgorithm::SHA256, m_privKey) >> tr::streamSink(sig);
179
180 input.write(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
181 input.write(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
182 input.write(d.getContent(). wire(), d.getContent(). size());
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400183 input.write(signatureInfo. wireEncode().wire(), signatureInfo. wireEncode().size());
Junxiao Shi81206d52017-07-23 12:43:22 +0000184 input.end();
185 }
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400186 d.setSignatureValue(sig.buf());
Junxiao Shi81206d52017-07-23 12:43:22 +0000187
188 Block dataBlock(d.wireEncode());
189 BOOST_CHECK_EQUAL_COLLECTIONS(DATA1, DATA1 + sizeof(DATA1),
190 dataBlock.begin(), dataBlock.end());
191}
192
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000193BOOST_FIXTURE_TEST_CASE(Decode02, DataSigningKeyFixture)
Junxiao Shi81206d52017-07-23 12:43:22 +0000194{
195 Block dataBlock(DATA1, sizeof(DATA1));
196 Data d(dataBlock);
197
198 BOOST_CHECK_EQUAL(d.getName().toUri(), "/local/ndn/prefix");
Davide Pesavento869b11e2019-08-18 17:44:27 -0400199 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500200 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 10_s);
Junxiao Shi81206d52017-07-23 12:43:22 +0000201 BOOST_CHECK_EQUAL(std::string(reinterpret_cast<const char*>(d.getContent().value()),
202 d.getContent().value_size()), "SUCCESS!");
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400203 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::SignatureSha256WithRsa);
Junxiao Shi81206d52017-07-23 12:43:22 +0000204
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700205 Block block = d.getSignatureInfo().wireEncode();
Junxiao Shi81206d52017-07-23 12:43:22 +0000206 block.parse();
207 KeyLocator keyLocator(block.get(tlv::KeyLocator));
208 BOOST_CHECK_EQUAL(keyLocator.getName().toUri(), "/test/key/locator");
209
210 BOOST_CHECK(security::verifySignature(d, m_pubKey));
211}
212
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000213class Decode03Fixture
214{
215protected:
216 Decode03Fixture()
217 {
218 // initialize all elements to non-empty, to verify wireDecode clears them
219 d.setName("/A");
220 d.setContentType(tlv::ContentType_Key);
221 d.setContent("1504C0C1C2C3"_block);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700222 d.setSignatureInfo(SignatureInfo("160A 1B0101 1C050703080142"_block));
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400223 d.setSignatureValue(fromHex("B48F1707A3BCA3CFC5F32DE51D9B46C32D7D262A21544EBDA88C3B415D637503"
224 "FC9BEF20F88202A56AF9831E0D30205FD4154B08502BCDEE860267A5C3E03D8E"
225 "A6CB74BE391C01E0A57B991B4404FC11B7D777F1B700A4B65F201118CF1840A8"
226 "30A2A7C17DB4B7A8777E58515121AF9E2498627F8475414CDFD9801B8152AD5B"));
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000227 }
228
229protected:
230 Data d;
231};
232
233BOOST_FIXTURE_TEST_SUITE(Decode03, Decode03Fixture)
234
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000235BOOST_AUTO_TEST_CASE(Minimal)
236{
237 d.wireDecode("062C 0703080144 16031B0100 "
238 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
239 BOOST_CHECK_EQUAL(d.getName(), "/D");
Davide Pesaventoef654dd2019-07-18 20:02:44 -0400240 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
241 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
242 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000243 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400244 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::DigestSha256);
245 BOOST_CHECK_EQUAL(d.getKeyLocator().has_value(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700246 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 32);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000247
248 // encode without modification: retain original wire encoding
249 BOOST_CHECK_EQUAL(d.wireEncode().value_size(), 44);
250
251 // modify then re-encode as v0.2 format
252 d.setName("/E");
Junxiao Shi72c0c642018-04-20 15:41:09 +0000253 BOOST_CHECK_EQUAL(d.wireEncode(),
254 "0630 0703080145 1400 1500 16031B0100 "
255 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000256}
257
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700258BOOST_AUTO_TEST_CASE(MinimalEmptyName)
259{
260 d.wireDecode("0609 0700 16031B0100 1700"_block);
261 BOOST_CHECK_EQUAL(d.getName(), "/"); // empty Name is allowed in Data
262 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
263 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
264 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
265 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400266 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::DigestSha256);
267 BOOST_CHECK_EQUAL(d.getKeyLocator().has_value(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700268 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 0);
269}
270
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000271BOOST_AUTO_TEST_CASE(Full)
272{
Junxiao Shi8b753a22018-10-24 01:51:40 +0000273 d.wireDecode("063A 0703080144 FC00 1400 FC00 1500 FC00 16031B0100 FC00 "
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000274 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 FC00"_block);
275 BOOST_CHECK_EQUAL(d.getName(), "/D");
Davide Pesaventoef654dd2019-07-18 20:02:44 -0400276 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);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000279 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400280 BOOST_CHECK_EQUAL(d.getSignatureType(), tlv::DigestSha256);
281 BOOST_CHECK_EQUAL(d.getKeyLocator().has_value(), false);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700282 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 32);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000283
284 // encode without modification: retain original wire encoding
Junxiao Shi8b753a22018-10-24 01:51:40 +0000285 BOOST_CHECK_EQUAL(d.wireEncode().value_size(), 58);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000286
287 // modify then re-encode as v0.2 format
288 d.setName("/E");
Junxiao Shi72c0c642018-04-20 15:41:09 +0000289 BOOST_CHECK_EQUAL(d.wireEncode(),
290 "0630 0703080145 1400 1500 16031B0100 "
291 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000292}
293
294BOOST_AUTO_TEST_CASE(CriticalElementOutOfOrder)
295{
296 BOOST_CHECK_THROW(d.wireDecode(
297 "0630 1400 0703080145 1500 16031B0100 "
298 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
299 tlv::Error);
300 BOOST_CHECK_THROW(d.wireDecode(
301 "0630 0703080145 1500 1400 16031B0100 "
302 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
303 tlv::Error);
304 BOOST_CHECK_THROW(d.wireDecode(
305 "0630 0703080145 1400 16031B0100 1500 "
306 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
307 tlv::Error);
308 BOOST_CHECK_THROW(d.wireDecode(
309 "0630 0703080145 1400 1500 "
310 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 16031B0100"_block),
311 tlv::Error);
312 BOOST_CHECK_THROW(d.wireDecode(
313 "0652 0703080145 1400 1500 16031B0100 "
314 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"
315 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
316 tlv::Error);
317}
318
319BOOST_AUTO_TEST_CASE(NameMissing)
320{
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700321 BOOST_CHECK_THROW(d.wireDecode("0605 16031B0100 1700"_block), tlv::Error);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000322}
323
324BOOST_AUTO_TEST_CASE(SigInfoMissing)
325{
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700326 BOOST_CHECK_THROW(d.wireDecode("0605 0703080144 1700"_block), tlv::Error);
327}
328
329BOOST_AUTO_TEST_CASE(SigValueMissing)
330{
331 BOOST_CHECK_THROW(d.wireDecode("0607 0700 16031B0100"_block), tlv::Error);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000332}
333
Junxiao Shi8b753a22018-10-24 01:51:40 +0000334BOOST_AUTO_TEST_CASE(UnrecognizedNonCriticalElementBeforeName)
335{
336 BOOST_CHECK_THROW(d.wireDecode(
337 "062F FC00 0703080144 16031B0100 "
338 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
339 tlv::Error);
340}
341
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000342BOOST_AUTO_TEST_CASE(UnrecognizedCriticalElement)
343{
344 BOOST_CHECK_THROW(d.wireDecode(
345 "0632 0703080145 FB00 1400 1500 16031B0100 "
346 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
347 tlv::Error);
348}
349
350BOOST_AUTO_TEST_SUITE_END() // Decode03
351
Junxiao Shi81206d52017-07-23 12:43:22 +0000352BOOST_FIXTURE_TEST_CASE(FullName, IdentityManagementFixture)
353{
354 Data d(Name("/local/ndn/prefix"));
355 d.setContentType(tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500356 d.setFreshnessPeriod(10_s);
Junxiao Shi81206d52017-07-23 12:43:22 +0000357 d.setContent(CONTENT1, sizeof(CONTENT1));
358 BOOST_CHECK_THROW(d.getFullName(), Data::Error); // FullName is unavailable without signing
359
360 m_keyChain.sign(d);
361 BOOST_CHECK_EQUAL(d.hasWire(), true);
362 Name fullName = d.getFullName(); // FullName is available after signing
363
364 BOOST_CHECK_EQUAL(d.getName().size() + 1, fullName.size());
365 BOOST_CHECK_EQUAL_COLLECTIONS(d.getName().begin(), d.getName().end(),
366 fullName.begin(), fullName.end() - 1);
367 BOOST_CHECK_EQUAL(fullName.get(-1).value_size(), util::Sha256::DIGEST_SIZE);
368
369 // FullName should be cached, so value() pointer points to same memory location
370 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
371
Davide Pesavento0f830802018-01-16 23:58:58 -0500372 d.setFreshnessPeriod(100_s); // invalidates FullName
Junxiao Shi81206d52017-07-23 12:43:22 +0000373 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
374
375 Data d1(Block(DATA1, sizeof(DATA1)));
376 BOOST_CHECK_EQUAL(d1.getFullName(),
377 "/local/ndn/prefix/"
378 "sha256digest=28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548");
379}
380
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400381BOOST_AUTO_TEST_CASE(Content)
382{
383 Data d;
384 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
385 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
386
387 const uint8_t direct[] = {0xca, 0xfe};
388 d.setContent("1502CAFE"_block); // Block overload, used directly as Content
389 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
390 BOOST_CHECK_EQUAL_COLLECTIONS(d.getContent().value_begin(), d.getContent().value_end(),
391 direct, direct + sizeof(direct));
392
393 const uint8_t nested[] = {0x99, 0x02, 0xca, 0xfe};
394 d.setContent(Block(nested, sizeof(nested))); // Block overload, nested inside Content element
395 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
396 BOOST_CHECK_EQUAL_COLLECTIONS(d.getContent().value_begin(), d.getContent().value_end(),
397 nested, nested + sizeof(nested));
398
399 d.setContent(nested, sizeof(nested)); // raw buffer overload
400 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
401 BOOST_CHECK_EQUAL_COLLECTIONS(d.getContent().value_begin(), d.getContent().value_end(),
402 nested, nested + sizeof(nested));
403
404 d.setContent(std::make_shared<Buffer>(direct, sizeof(direct))); // ConstBufferPtr overload
405 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
406 BOOST_CHECK_EQUAL_COLLECTIONS(d.getContent().value_begin(), d.getContent().value_end(),
407 direct, direct + sizeof(direct));
408
409 d.setContent(std::make_shared<Buffer>()); // ConstBufferPtr overload, empty buffer
410 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
411 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
412
413 BOOST_CHECK_THROW(d.setContent(nullptr), std::invalid_argument);
414}
415
416BOOST_AUTO_TEST_CASE(SignatureValue)
417{
418 Data d;
419 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::Invalid);
420
421 d.setSignatureValue(fromHex("FACADE"));
422 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::SignatureValue);
423 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 3);
424
425 d.setSignatureValue(std::make_shared<Buffer>()); // empty buffer
426 BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::SignatureValue);
427 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 0);
428
429 BOOST_CHECK_THROW(d.setSignatureValue(nullptr), std::invalid_argument);
430}
431
Junxiao Shi81206d52017-07-23 12:43:22 +0000432BOOST_AUTO_TEST_CASE(Equality)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700433{
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700434 Data a;
435 Data b;
436 BOOST_CHECK_EQUAL(a == b, true);
437 BOOST_CHECK_EQUAL(a != b, false);
438
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400439 a.setName("/A");
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700440 BOOST_CHECK_EQUAL(a == b, false);
441 BOOST_CHECK_EQUAL(a != b, true);
442
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400443 b.setName("/B");
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700444 BOOST_CHECK_EQUAL(a == b, false);
445 BOOST_CHECK_EQUAL(a != b, true);
446
Davide Pesavento14c56cd2020-05-21 01:44:03 -0400447 b.setName("/A");
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700448 BOOST_CHECK_EQUAL(a == b, true);
449 BOOST_CHECK_EQUAL(a != b, false);
450
Davide Pesavento0f830802018-01-16 23:58:58 -0500451 a.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700452 BOOST_CHECK_EQUAL(a == b, false);
453 BOOST_CHECK_EQUAL(a != b, true);
454
Davide Pesavento0f830802018-01-16 23:58:58 -0500455 b.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700456 BOOST_CHECK_EQUAL(a == b, true);
457 BOOST_CHECK_EQUAL(a != b, false);
458
459 static const uint8_t someData[] = "someData";
460 a.setContent(someData, sizeof(someData));
461 BOOST_CHECK_EQUAL(a == b, false);
462 BOOST_CHECK_EQUAL(a != b, true);
463
464 b.setContent(someData, sizeof(someData));
465 BOOST_CHECK_EQUAL(a == b, true);
466 BOOST_CHECK_EQUAL(a != b, false);
467
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700468 a.setSignatureInfo(SignatureInfo(tlv::SignatureSha256WithRsa));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700469 BOOST_CHECK_EQUAL(a == b, false);
470 BOOST_CHECK_EQUAL(a != b, true);
471
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700472 b.setSignatureInfo(SignatureInfo(tlv::SignatureSha256WithRsa));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700473 BOOST_CHECK_EQUAL(a == b, true);
474 BOOST_CHECK_EQUAL(a != b, false);
475}
476
Junxiao Shi81206d52017-07-23 12:43:22 +0000477BOOST_AUTO_TEST_CASE(Print)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700478{
Junxiao Shi81206d52017-07-23 12:43:22 +0000479 Data d(Block(DATA1, sizeof(DATA1)));
480 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(d),
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700481 "Name: /local/ndn/prefix\n"
482 "MetaInfo: ContentType: 0, FreshnessPeriod: 10000 milliseconds\n"
483 "Content: (size: 8)\n"
Junxiao Shi605671d2017-08-26 13:41:06 +0000484 "Signature: (type: SignatureSha256WithRsa, value_length: 128)\n");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800485}
486
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100487BOOST_AUTO_TEST_SUITE_END() // TestData
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800488
Spyridon Mastorakis429634f2015-02-19 17:35:33 -0800489} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800490} // namespace ndn