blob: 041ddc0fa648e8f107e9a7ff73721ed61fd926eb [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"
24#include "ndn-cxx/security/signature-sha256-with-rsa.hpp"
25#include "ndn-cxx/security/transform/private-key.hpp"
26#include "ndn-cxx/security/transform/public-key.hpp"
27#include "ndn-cxx/security/transform/signer-filter.hpp"
28#include "ndn-cxx/security/transform/step-source.hpp"
29#include "ndn-cxx/security/transform/stream-sink.hpp"
30#include "ndn-cxx/security/verification-helpers.hpp"
31#include "ndn-cxx/util/sha256.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"
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
40BOOST_AUTO_TEST_SUITE(TestData)
41
Junxiao Shi81206d52017-07-23 12:43:22 +000042const uint8_t CONTENT1[] = {0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21};
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080043
Junxiao Shi81206d52017-07-23 12:43:22 +000044const uint8_t DATA1[] = {
450x06, 0xc5, // Data
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070046 0x07, 0x14, // Name
47 0x08, 0x05,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080048 0x6c, 0x6f, 0x63, 0x61, 0x6c,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070049 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080050 0x6e, 0x64, 0x6e,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070051 0x08, 0x06,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080052 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080053 0x14, 0x04, // MetaInfo
54 0x19, 0x02, // FreshnessPeriod
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070055 0x27, 0x10,
56 0x15, 0x08, // Content
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080057 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080058 0x16, 0x1b, // SignatureInfo
59 0x1b, 0x01, // SignatureType
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070060 0x01,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080061 0x1c, 0x16, // KeyLocator
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070062 0x07, 0x14, // Name
63 0x08, 0x04,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080064 0x74, 0x65, 0x73, 0x74,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070065 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080066 0x6b, 0x65, 0x79,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070067 0x08, 0x07,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080068 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080069 0x17, 0x80, // SignatureValue
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070070 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
71 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
72 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
73 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
74 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
75 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
76 0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
77 0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
78 0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
79 0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080080};
81
Junxiao Shi81206d52017-07-23 12:43:22 +000082BOOST_AUTO_TEST_CASE(DefaultConstructor)
83{
84 Data d;
85 BOOST_CHECK_EQUAL(d.hasWire(), false);
86 BOOST_CHECK_EQUAL(d.getName(), "/");
87 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
88 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), DEFAULT_FRESHNESS_PERIOD);
Junxiao Shi7d9039b2018-04-14 15:56:28 +000089 BOOST_CHECK(!d.getFinalBlock());
Junxiao Shi81206d52017-07-23 12:43:22 +000090 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
91 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Eric Newberrya3c8bd12020-05-15 17:27:07 -070092 BOOST_CHECK(!d.getSignatureInfo());
Junxiao Shi81206d52017-07-23 12:43:22 +000093}
94
95class DataSigningKeyFixture
96{
97protected:
98 DataSigningKeyFixture()
99 {
100 m_privKey.loadPkcs1(PRIVATE_KEY_DER, sizeof(PRIVATE_KEY_DER));
101 auto buf = m_privKey.derivePublicKey();
102 m_pubKey.loadPkcs8(buf->data(), buf->size());
103 }
104
105protected:
106 security::transform::PrivateKey m_privKey;
107 security::transform::PublicKey m_pubKey;
108
109private:
110 static const uint8_t PRIVATE_KEY_DER[632];
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800111};
112
Junxiao Shi81206d52017-07-23 12:43:22 +0000113const uint8_t DataSigningKeyFixture::PRIVATE_KEY_DER[] = {
114 0x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
115 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82, 0x02, 0x5a, 0x02, 0x01,
116 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e, 0x47, 0x85, 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47,
117 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05, 0x3a, 0x24, 0x1e, 0xeb, 0x89, 0x01, 0xbb, 0xe9,
118 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68, 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7,
119 0x06, 0x90, 0x9c, 0xaa, 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3,
120 0x1b, 0x88, 0x9a, 0x97, 0x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82,
121 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d, 0x24, 0xc2, 0x63, 0xf3, 0x97, 0x17, 0xeb, 0xfe,
122 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f, 0xb8, 0xf2, 0xf1, 0xc5,
123 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed, 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76,
124 0x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11, 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0,
125 0x2a, 0xe3, 0x6b, 0x0c, 0x8b, 0x73, 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c,
126 0x5b, 0x43, 0x29, 0xad, 0x3a, 0x3b, 0x93, 0xa3, 0x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e,
127 0x33, 0x3f, 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44, 0x00, 0xde, 0x72, 0xed,
128 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2, 0x69, 0x1f,
129 0xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13, 0x06, 0x69, 0x06, 0xd8,
130 0x3f, 0x22, 0x15, 0x75, 0xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66, 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2,
131 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37, 0x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88,
132 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f, 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02, 0x41, 0x00, 0xb6, 0x2e,
133 0xbb, 0xcd, 0x2f, 0x3a, 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e,
134 0x64, 0xa7, 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae,
135 0xb0, 0x74, 0xa6, 0x99, 0xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e, 0x56, 0xad,
136 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c, 0xb7, 0x9a, 0x3e, 0x99, 0xef, 0xb9, 0x02, 0x41,
137 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1, 0xac, 0xee, 0xcb, 0x41, 0x81, 0xc6,
138 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21, 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96,
139 0x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8, 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6,
140 0x90, 0xb5, 0xce, 0x1b, 0x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a,
141 0x7f, 0x02, 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0, 0x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89,
142 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee, 0x51, 0x57, 0xd5, 0x97,
143 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e, 0x88, 0x63, 0xe2, 0x66,
144 0x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a, 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca,
145 0x78, 0xab, 0x21, 0x02, 0x41, 0x00, 0x8f, 0xae, 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24,
146 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81, 0xbc, 0x2c, 0x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d,
147 0x28, 0xd9, 0x10, 0x1a, 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14, 0xbf, 0xc9, 0xff, 0x17,
148 0xd6, 0x47, 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
149 0xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a, 0x33, 0x2f,
150 0x4b, 0xa2, 0xbd, 0xd1, 0xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15, 0x37, 0x1b, 0xde, 0x76,
151 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9, 0x4f, 0x35, 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95,
152 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21, 0x6d, 0xa0, 0x84, 0x39, 0xe9, 0x2e, 0x1e, 0xfc,
153 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d, 0x0a, 0xb6
154};
155
156BOOST_FIXTURE_TEST_CASE(Encode, DataSigningKeyFixture)
157{
158 // manual data packet creation for now
159
160 Data d(Name("/local/ndn/prefix"));
161 d.setContentType(tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500162 d.setFreshnessPeriod(10_s);
Junxiao Shi81206d52017-07-23 12:43:22 +0000163 d.setContent(CONTENT1, sizeof(CONTENT1));
164
165 Block signatureInfo(tlv::SignatureInfo);
166 // SignatureType
167 signatureInfo.push_back(makeNonNegativeIntegerBlock(tlv::SignatureType, tlv::SignatureSha256WithRsa));
168 // KeyLocator
169 {
170 KeyLocator keyLocator;
171 keyLocator.setName("/test/key/locator");
172 signatureInfo.push_back(keyLocator.wireEncode());
173 }
174 signatureInfo.encode();
175
176 // SignatureValue
177 OBufferStream os;
178 tlv::writeVarNumber(os, tlv::SignatureValue);
179
180 OBufferStream sig;
181 {
182 namespace tr = security::transform;
183
184 tr::StepSource input;
185 input >> tr::signerFilter(DigestAlgorithm::SHA256, m_privKey) >> tr::streamSink(sig);
186
187 input.write(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
188 input.write(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
189 input.write(d.getContent(). wire(), d.getContent(). size());
190 input.write(signatureInfo. wire(), signatureInfo. size());
191 input.end();
192 }
193 auto buf = sig.buf();
194 tlv::writeVarNumber(os, buf->size());
Davide Pesavento5d0b0102017-10-07 13:43:16 -0400195 os.write(buf->get<char>(), buf->size());
Junxiao Shi81206d52017-07-23 12:43:22 +0000196
197 Block signatureValue(os.buf());
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700198 d.setSignatureInfo(SignatureInfo(signatureInfo));
199 d.setSignatureValue(signatureValue);
Junxiao Shi81206d52017-07-23 12:43:22 +0000200
201 Block dataBlock(d.wireEncode());
202 BOOST_CHECK_EQUAL_COLLECTIONS(DATA1, DATA1 + sizeof(DATA1),
203 dataBlock.begin(), dataBlock.end());
204}
205
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000206BOOST_FIXTURE_TEST_CASE(Decode02, DataSigningKeyFixture)
Junxiao Shi81206d52017-07-23 12:43:22 +0000207{
208 Block dataBlock(DATA1, sizeof(DATA1));
209 Data d(dataBlock);
210
211 BOOST_CHECK_EQUAL(d.getName().toUri(), "/local/ndn/prefix");
Davide Pesavento869b11e2019-08-18 17:44:27 -0400212 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500213 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 10_s);
Junxiao Shi81206d52017-07-23 12:43:22 +0000214 BOOST_CHECK_EQUAL(std::string(reinterpret_cast<const char*>(d.getContent().value()),
215 d.getContent().value_size()), "SUCCESS!");
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700216 BOOST_CHECK_EQUAL(d.getSignatureInfo().getSignatureType(), tlv::SignatureSha256WithRsa);
Junxiao Shi81206d52017-07-23 12:43:22 +0000217
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700218 Block block = d.getSignatureInfo().wireEncode();
Junxiao Shi81206d52017-07-23 12:43:22 +0000219 block.parse();
220 KeyLocator keyLocator(block.get(tlv::KeyLocator));
221 BOOST_CHECK_EQUAL(keyLocator.getName().toUri(), "/test/key/locator");
222
223 BOOST_CHECK(security::verifySignature(d, m_pubKey));
224}
225
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000226class Decode03Fixture
227{
228protected:
229 Decode03Fixture()
230 {
231 // initialize all elements to non-empty, to verify wireDecode clears them
232 d.setName("/A");
233 d.setContentType(tlv::ContentType_Key);
234 d.setContent("1504C0C1C2C3"_block);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700235 d.setSignatureInfo(SignatureInfo("160A 1B0101 1C050703080142"_block));
236 d.setSignatureValue("1780 B48F1707A3BCA3CFC5F32DE51D9B46C32D7D262A21544EBDA88C3B415D637503"
237 "FC9BEF20F88202A56AF9831E0D30205FD4154B08502BCDEE860267A5C3E03D8E"
238 "A6CB74BE391C01E0A57B991B4404FC11B7D777F1B700A4B65F201118CF1840A8"
239 "30A2A7C17DB4B7A8777E58515121AF9E2498627F8475414CDFD9801B8152AD5B"_block);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000240 }
241
242protected:
243 Data d;
244};
245
246BOOST_FIXTURE_TEST_SUITE(Decode03, Decode03Fixture)
247
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000248BOOST_AUTO_TEST_CASE(Minimal)
249{
250 d.wireDecode("062C 0703080144 16031B0100 "
251 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
252 BOOST_CHECK_EQUAL(d.getName(), "/D");
Davide Pesaventoef654dd2019-07-18 20:02:44 -0400253 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
254 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
255 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000256 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700257 BOOST_CHECK_EQUAL(d.getSignatureInfo().getSignatureType(), tlv::DigestSha256);
258 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 32);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000259
260 // encode without modification: retain original wire encoding
261 BOOST_CHECK_EQUAL(d.wireEncode().value_size(), 44);
262
263 // modify then re-encode as v0.2 format
264 d.setName("/E");
Junxiao Shi72c0c642018-04-20 15:41:09 +0000265 BOOST_CHECK_EQUAL(d.wireEncode(),
266 "0630 0703080145 1400 1500 16031B0100 "
267 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000268}
269
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700270BOOST_AUTO_TEST_CASE(MinimalEmptyName)
271{
272 d.wireDecode("0609 0700 16031B0100 1700"_block);
273 BOOST_CHECK_EQUAL(d.getName(), "/"); // empty Name is allowed in Data
274 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
275 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
276 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
277 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
278 BOOST_CHECK_EQUAL(d.getSignatureInfo().getSignatureType(), tlv::DigestSha256);
279 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 0);
280}
281
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000282BOOST_AUTO_TEST_CASE(Full)
283{
Junxiao Shi8b753a22018-10-24 01:51:40 +0000284 d.wireDecode("063A 0703080144 FC00 1400 FC00 1500 FC00 16031B0100 FC00 "
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000285 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 FC00"_block);
286 BOOST_CHECK_EQUAL(d.getName(), "/D");
Davide Pesaventoef654dd2019-07-18 20:02:44 -0400287 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
288 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 0_ms);
289 BOOST_CHECK_EQUAL(d.getFinalBlock().has_value(), false);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000290 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700291 BOOST_CHECK_EQUAL(d.getSignatureInfo().getSignatureType(), tlv::DigestSha256);
292 BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 32);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000293
294 // encode without modification: retain original wire encoding
Junxiao Shi8b753a22018-10-24 01:51:40 +0000295 BOOST_CHECK_EQUAL(d.wireEncode().value_size(), 58);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000296
297 // modify then re-encode as v0.2 format
298 d.setName("/E");
Junxiao Shi72c0c642018-04-20 15:41:09 +0000299 BOOST_CHECK_EQUAL(d.wireEncode(),
300 "0630 0703080145 1400 1500 16031B0100 "
301 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000302}
303
304BOOST_AUTO_TEST_CASE(CriticalElementOutOfOrder)
305{
306 BOOST_CHECK_THROW(d.wireDecode(
307 "0630 1400 0703080145 1500 16031B0100 "
308 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
309 tlv::Error);
310 BOOST_CHECK_THROW(d.wireDecode(
311 "0630 0703080145 1500 1400 16031B0100 "
312 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
313 tlv::Error);
314 BOOST_CHECK_THROW(d.wireDecode(
315 "0630 0703080145 1400 16031B0100 1500 "
316 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
317 tlv::Error);
318 BOOST_CHECK_THROW(d.wireDecode(
319 "0630 0703080145 1400 1500 "
320 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 16031B0100"_block),
321 tlv::Error);
322 BOOST_CHECK_THROW(d.wireDecode(
323 "0652 0703080145 1400 1500 16031B0100 "
324 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"
325 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
326 tlv::Error);
327}
328
329BOOST_AUTO_TEST_CASE(NameMissing)
330{
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700331 BOOST_CHECK_THROW(d.wireDecode("0605 16031B0100 1700"_block), tlv::Error);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000332}
333
334BOOST_AUTO_TEST_CASE(SigInfoMissing)
335{
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700336 BOOST_CHECK_THROW(d.wireDecode("0605 0703080144 1700"_block), tlv::Error);
337}
338
339BOOST_AUTO_TEST_CASE(SigValueMissing)
340{
341 BOOST_CHECK_THROW(d.wireDecode("0607 0700 16031B0100"_block), tlv::Error);
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000342}
343
Junxiao Shi8b753a22018-10-24 01:51:40 +0000344BOOST_AUTO_TEST_CASE(UnrecognizedNonCriticalElementBeforeName)
345{
346 BOOST_CHECK_THROW(d.wireDecode(
347 "062F FC00 0703080144 16031B0100 "
348 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
349 tlv::Error);
350}
351
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000352BOOST_AUTO_TEST_CASE(UnrecognizedCriticalElement)
353{
354 BOOST_CHECK_THROW(d.wireDecode(
355 "0632 0703080145 FB00 1400 1500 16031B0100 "
356 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
357 tlv::Error);
358}
359
360BOOST_AUTO_TEST_SUITE_END() // Decode03
361
Junxiao Shi81206d52017-07-23 12:43:22 +0000362BOOST_FIXTURE_TEST_CASE(FullName, IdentityManagementFixture)
363{
364 Data d(Name("/local/ndn/prefix"));
365 d.setContentType(tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500366 d.setFreshnessPeriod(10_s);
Junxiao Shi81206d52017-07-23 12:43:22 +0000367 d.setContent(CONTENT1, sizeof(CONTENT1));
368 BOOST_CHECK_THROW(d.getFullName(), Data::Error); // FullName is unavailable without signing
369
370 m_keyChain.sign(d);
371 BOOST_CHECK_EQUAL(d.hasWire(), true);
372 Name fullName = d.getFullName(); // FullName is available after signing
373
374 BOOST_CHECK_EQUAL(d.getName().size() + 1, fullName.size());
375 BOOST_CHECK_EQUAL_COLLECTIONS(d.getName().begin(), d.getName().end(),
376 fullName.begin(), fullName.end() - 1);
377 BOOST_CHECK_EQUAL(fullName.get(-1).value_size(), util::Sha256::DIGEST_SIZE);
378
379 // FullName should be cached, so value() pointer points to same memory location
380 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
381
Davide Pesavento0f830802018-01-16 23:58:58 -0500382 d.setFreshnessPeriod(100_s); // invalidates FullName
Junxiao Shi81206d52017-07-23 12:43:22 +0000383 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
384
385 Data d1(Block(DATA1, sizeof(DATA1)));
386 BOOST_CHECK_EQUAL(d1.getFullName(),
387 "/local/ndn/prefix/"
388 "sha256digest=28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548");
389}
390
Junxiao Shi81206d52017-07-23 12:43:22 +0000391BOOST_AUTO_TEST_CASE(Equality)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700392{
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700393 Data a;
394 Data b;
395 BOOST_CHECK_EQUAL(a == b, true);
396 BOOST_CHECK_EQUAL(a != b, false);
397
398 a.setName("ndn:/A");
399 BOOST_CHECK_EQUAL(a == b, false);
400 BOOST_CHECK_EQUAL(a != b, true);
401
402 b.setName("ndn:/B");
403 BOOST_CHECK_EQUAL(a == b, false);
404 BOOST_CHECK_EQUAL(a != b, true);
405
406 b.setName("ndn:/A");
407 BOOST_CHECK_EQUAL(a == b, true);
408 BOOST_CHECK_EQUAL(a != b, false);
409
Davide Pesavento0f830802018-01-16 23:58:58 -0500410 a.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700411 BOOST_CHECK_EQUAL(a == b, false);
412 BOOST_CHECK_EQUAL(a != b, true);
413
Davide Pesavento0f830802018-01-16 23:58:58 -0500414 b.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700415 BOOST_CHECK_EQUAL(a == b, true);
416 BOOST_CHECK_EQUAL(a != b, false);
417
418 static const uint8_t someData[] = "someData";
419 a.setContent(someData, sizeof(someData));
420 BOOST_CHECK_EQUAL(a == b, false);
421 BOOST_CHECK_EQUAL(a != b, true);
422
423 b.setContent(someData, sizeof(someData));
424 BOOST_CHECK_EQUAL(a == b, true);
425 BOOST_CHECK_EQUAL(a != b, false);
426
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700427 a.setSignatureInfo(SignatureInfo(tlv::SignatureSha256WithRsa));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700428 BOOST_CHECK_EQUAL(a == b, false);
429 BOOST_CHECK_EQUAL(a != b, true);
430
Eric Newberrya3c8bd12020-05-15 17:27:07 -0700431 b.setSignatureInfo(SignatureInfo(tlv::SignatureSha256WithRsa));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700432 BOOST_CHECK_EQUAL(a == b, true);
433 BOOST_CHECK_EQUAL(a != b, false);
434}
435
Junxiao Shi81206d52017-07-23 12:43:22 +0000436BOOST_AUTO_TEST_CASE(Print)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700437{
Junxiao Shi81206d52017-07-23 12:43:22 +0000438 Data d(Block(DATA1, sizeof(DATA1)));
439 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(d),
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700440 "Name: /local/ndn/prefix\n"
441 "MetaInfo: ContentType: 0, FreshnessPeriod: 10000 milliseconds\n"
442 "Content: (size: 8)\n"
Junxiao Shi605671d2017-08-26 13:41:06 +0000443 "Signature: (type: SignatureSha256WithRsa, value_length: 128)\n");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800444}
445
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100446BOOST_AUTO_TEST_SUITE_END() // TestData
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800447
Spyridon Mastorakis429634f2015-02-19 17:35:33 -0800448} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800449} // namespace ndn