blob: ccf4e5bc5fbfdf036552eccdbb3826b598d807ef [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 Pesavento0f830802018-01-16 23:58:58 -05003 * Copyright (c) 2013-2018 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
Alexander Afanasyev09c613f2014-01-29 00:23:58 -080022#include "data.hpp"
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -070023#include "encoding/buffer-stream.hpp"
Alexander Afanasyevadc71842017-01-26 22:17:58 -050024#include "security/signature-sha256-with-rsa.hpp"
Davide Pesaventoc2e12b42017-07-09 20:35:09 -040025#include "security/transform/private-key.hpp"
26#include "security/transform/public-key.hpp"
27#include "security/transform/signer-filter.hpp"
28#include "security/transform/step-source.hpp"
29#include "security/transform/stream-sink.hpp"
30#include "security/verification-helpers.hpp"
Junxiao Shi6938e342017-07-25 21:56:58 +000031#include "util/sha256.hpp"
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080032
Junxiao Shi7d9039b2018-04-14 15:56:28 +000033#include "block-literal.hpp"
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070034#include "boost-test.hpp"
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -070035#include "identity-management-fixture.hpp"
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[] = {
460x06, 0xc5, // Data
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070047 0x07, 0x14, // Name
48 0x08, 0x05,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080049 0x6c, 0x6f, 0x63, 0x61, 0x6c,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070050 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080051 0x6e, 0x64, 0x6e,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070052 0x08, 0x06,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080053 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080054 0x14, 0x04, // MetaInfo
55 0x19, 0x02, // FreshnessPeriod
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070056 0x27, 0x10,
57 0x15, 0x08, // Content
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080058 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080059 0x16, 0x1b, // SignatureInfo
60 0x1b, 0x01, // SignatureType
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070061 0x01,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080062 0x1c, 0x16, // KeyLocator
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070063 0x07, 0x14, // Name
64 0x08, 0x04,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080065 0x74, 0x65, 0x73, 0x74,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070066 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080067 0x6b, 0x65, 0x79,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070068 0x08, 0x07,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080069 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080070 0x17, 0x80, // SignatureValue
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070071 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
72 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
73 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
74 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
75 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
76 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
77 0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
78 0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
79 0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
80 0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080081};
82
Junxiao Shi81206d52017-07-23 12:43:22 +000083// ---- constructor, encode, decode ----
84
85BOOST_AUTO_TEST_CASE(DefaultConstructor)
86{
87 Data d;
88 BOOST_CHECK_EQUAL(d.hasWire(), false);
89 BOOST_CHECK_EQUAL(d.getName(), "/");
90 BOOST_CHECK_EQUAL(d.getContentType(), tlv::ContentType_Blob);
91 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), DEFAULT_FRESHNESS_PERIOD);
Junxiao Shi7d9039b2018-04-14 15:56:28 +000092 BOOST_CHECK(!d.getFinalBlock());
Junxiao Shi81206d52017-07-23 12:43:22 +000093 BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
94 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
95 BOOST_CHECK(!d.getSignature());
96}
97
98class DataSigningKeyFixture
99{
100protected:
101 DataSigningKeyFixture()
102 {
103 m_privKey.loadPkcs1(PRIVATE_KEY_DER, sizeof(PRIVATE_KEY_DER));
104 auto buf = m_privKey.derivePublicKey();
105 m_pubKey.loadPkcs8(buf->data(), buf->size());
106 }
107
108protected:
109 security::transform::PrivateKey m_privKey;
110 security::transform::PublicKey m_pubKey;
111
112private:
113 static const uint8_t PRIVATE_KEY_DER[632];
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800114};
115
Junxiao Shi81206d52017-07-23 12:43:22 +0000116const uint8_t DataSigningKeyFixture::PRIVATE_KEY_DER[] = {
117 0x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
118 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82, 0x02, 0x5a, 0x02, 0x01,
119 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e, 0x47, 0x85, 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47,
120 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05, 0x3a, 0x24, 0x1e, 0xeb, 0x89, 0x01, 0xbb, 0xe9,
121 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68, 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7,
122 0x06, 0x90, 0x9c, 0xaa, 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3,
123 0x1b, 0x88, 0x9a, 0x97, 0x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82,
124 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d, 0x24, 0xc2, 0x63, 0xf3, 0x97, 0x17, 0xeb, 0xfe,
125 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f, 0xb8, 0xf2, 0xf1, 0xc5,
126 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed, 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76,
127 0x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11, 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0,
128 0x2a, 0xe3, 0x6b, 0x0c, 0x8b, 0x73, 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c,
129 0x5b, 0x43, 0x29, 0xad, 0x3a, 0x3b, 0x93, 0xa3, 0x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e,
130 0x33, 0x3f, 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44, 0x00, 0xde, 0x72, 0xed,
131 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2, 0x69, 0x1f,
132 0xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13, 0x06, 0x69, 0x06, 0xd8,
133 0x3f, 0x22, 0x15, 0x75, 0xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66, 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2,
134 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37, 0x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88,
135 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f, 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02, 0x41, 0x00, 0xb6, 0x2e,
136 0xbb, 0xcd, 0x2f, 0x3a, 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e,
137 0x64, 0xa7, 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae,
138 0xb0, 0x74, 0xa6, 0x99, 0xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e, 0x56, 0xad,
139 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c, 0xb7, 0x9a, 0x3e, 0x99, 0xef, 0xb9, 0x02, 0x41,
140 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1, 0xac, 0xee, 0xcb, 0x41, 0x81, 0xc6,
141 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21, 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96,
142 0x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8, 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6,
143 0x90, 0xb5, 0xce, 0x1b, 0x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a,
144 0x7f, 0x02, 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0, 0x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89,
145 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee, 0x51, 0x57, 0xd5, 0x97,
146 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e, 0x88, 0x63, 0xe2, 0x66,
147 0x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a, 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca,
148 0x78, 0xab, 0x21, 0x02, 0x41, 0x00, 0x8f, 0xae, 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24,
149 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81, 0xbc, 0x2c, 0x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d,
150 0x28, 0xd9, 0x10, 0x1a, 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14, 0xbf, 0xc9, 0xff, 0x17,
151 0xd6, 0x47, 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
152 0xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a, 0x33, 0x2f,
153 0x4b, 0xa2, 0xbd, 0xd1, 0xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15, 0x37, 0x1b, 0xde, 0x76,
154 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9, 0x4f, 0x35, 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95,
155 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21, 0x6d, 0xa0, 0x84, 0x39, 0xe9, 0x2e, 0x1e, 0xfc,
156 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d, 0x0a, 0xb6
157};
158
159BOOST_FIXTURE_TEST_CASE(Encode, DataSigningKeyFixture)
160{
161 // manual data packet creation for now
162
163 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
168 Block signatureInfo(tlv::SignatureInfo);
169 // SignatureType
170 signatureInfo.push_back(makeNonNegativeIntegerBlock(tlv::SignatureType, tlv::SignatureSha256WithRsa));
171 // KeyLocator
172 {
173 KeyLocator keyLocator;
174 keyLocator.setName("/test/key/locator");
175 signatureInfo.push_back(keyLocator.wireEncode());
176 }
177 signatureInfo.encode();
178
179 // SignatureValue
180 OBufferStream os;
181 tlv::writeVarNumber(os, tlv::SignatureValue);
182
183 OBufferStream sig;
184 {
185 namespace tr = security::transform;
186
187 tr::StepSource input;
188 input >> tr::signerFilter(DigestAlgorithm::SHA256, m_privKey) >> tr::streamSink(sig);
189
190 input.write(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
191 input.write(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
192 input.write(d.getContent(). wire(), d.getContent(). size());
193 input.write(signatureInfo. wire(), signatureInfo. size());
194 input.end();
195 }
196 auto buf = sig.buf();
197 tlv::writeVarNumber(os, buf->size());
Davide Pesavento5d0b0102017-10-07 13:43:16 -0400198 os.write(buf->get<char>(), buf->size());
Junxiao Shi81206d52017-07-23 12:43:22 +0000199
200 Block signatureValue(os.buf());
201 Signature signature(signatureInfo, signatureValue);
202 d.setSignature(signature);
203
204 Block dataBlock(d.wireEncode());
205 BOOST_CHECK_EQUAL_COLLECTIONS(DATA1, DATA1 + sizeof(DATA1),
206 dataBlock.begin(), dataBlock.end());
207}
208
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000209BOOST_FIXTURE_TEST_CASE(Decode02, DataSigningKeyFixture)
Junxiao Shi81206d52017-07-23 12:43:22 +0000210{
211 Block dataBlock(DATA1, sizeof(DATA1));
212 Data d(dataBlock);
213
214 BOOST_CHECK_EQUAL(d.getName().toUri(), "/local/ndn/prefix");
215 BOOST_CHECK_EQUAL(d.getContentType(), static_cast<uint32_t>(tlv::ContentType_Blob));
Davide Pesavento0f830802018-01-16 23:58:58 -0500216 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), 10_s);
Junxiao Shi81206d52017-07-23 12:43:22 +0000217 BOOST_CHECK_EQUAL(std::string(reinterpret_cast<const char*>(d.getContent().value()),
218 d.getContent().value_size()), "SUCCESS!");
219 BOOST_CHECK_EQUAL(d.getSignature().getType(), tlv::SignatureSha256WithRsa);
220
221 Block block = d.getSignature().getInfo();
222 block.parse();
223 KeyLocator keyLocator(block.get(tlv::KeyLocator));
224 BOOST_CHECK_EQUAL(keyLocator.getName().toUri(), "/test/key/locator");
225
226 BOOST_CHECK(security::verifySignature(d, m_pubKey));
227}
228
Junxiao Shi7d9039b2018-04-14 15:56:28 +0000229class Decode03Fixture
230{
231protected:
232 Decode03Fixture()
233 {
234 // initialize all elements to non-empty, to verify wireDecode clears them
235 d.setName("/A");
236 d.setContentType(tlv::ContentType_Key);
237 d.setContent("1504C0C1C2C3"_block);
238 d.setSignature(Signature("160A 1B0101 1C050703080142"_block,
239 "1780 B48F1707A3BCA3CFC5F32DE51D9B46C32D7D262A21544EBDA88C3B415D637503"
240 "FC9BEF20F88202A56AF9831E0D30205FD4154B08502BCDEE860267A5C3E03D8E"
241 "A6CB74BE391C01E0A57B991B4404FC11B7D777F1B700A4B65F201118CF1840A8"
242 "30A2A7C17DB4B7A8777E58515121AF9E2498627F8475414CDFD9801B8152AD5B"_block));
243 }
244
245protected:
246 Data d;
247};
248
249BOOST_FIXTURE_TEST_SUITE(Decode03, Decode03Fixture)
250
251BOOST_AUTO_TEST_CASE(MinimalNoSigValue)
252{
253 d.wireDecode("0607 0700 16031B0100"_block);
254 BOOST_CHECK_EQUAL(d.getName(), "/"); // empty Name is allowed in Data
255 BOOST_CHECK_EQUAL(d.getMetaInfo(), MetaInfo());
256 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
257 BOOST_CHECK_EQUAL(d.getSignature().getType(), tlv::DigestSha256);
258 BOOST_CHECK_EQUAL(d.getSignature().getValue().value_size(), 0);
259}
260
261BOOST_AUTO_TEST_CASE(Minimal)
262{
263 d.wireDecode("062C 0703080144 16031B0100 "
264 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
265 BOOST_CHECK_EQUAL(d.getName(), "/D");
266 BOOST_CHECK_EQUAL(d.getMetaInfo(), MetaInfo());
267 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
268 BOOST_CHECK_EQUAL(d.getSignature().getType(), tlv::DigestSha256);
269 BOOST_CHECK_EQUAL(d.getSignature().getValue().value_size(), 32);
270
271 // encode without modification: retain original wire encoding
272 BOOST_CHECK_EQUAL(d.wireEncode().value_size(), 44);
273
274 // modify then re-encode as v0.2 format
275 d.setName("/E");
276 BOOST_CHECK(d.wireEncode() ==
277 "0630 0703080145 1400 1500 16031B0100 "
278 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
279}
280
281BOOST_AUTO_TEST_CASE(Full)
282{
283 d.wireDecode("063C FC00 0703080144 FC00 1400 FC00 1500 FC00 16031B0100 FC00 "
284 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 FC00"_block);
285 BOOST_CHECK_EQUAL(d.getName(), "/D");
286 BOOST_CHECK_EQUAL(d.getMetaInfo(), MetaInfo());
287 BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
288 BOOST_CHECK_EQUAL(d.getSignature().getType(), tlv::DigestSha256);
289 BOOST_CHECK_EQUAL(d.getSignature().getValue().value_size(), 32);
290
291 // encode without modification: retain original wire encoding
292 BOOST_CHECK_EQUAL(d.wireEncode().value_size(), 60);
293
294 // modify then re-encode as v0.2 format
295 d.setName("/E");
296 BOOST_CHECK(d.wireEncode() ==
297 "0630 0703080145 1400 1500 16031B0100 "
298 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block);
299}
300
301BOOST_AUTO_TEST_CASE(CriticalElementOutOfOrder)
302{
303 BOOST_CHECK_THROW(d.wireDecode(
304 "0630 1400 0703080145 1500 16031B0100 "
305 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
306 tlv::Error);
307 BOOST_CHECK_THROW(d.wireDecode(
308 "0630 0703080145 1500 1400 16031B0100 "
309 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
310 tlv::Error);
311 BOOST_CHECK_THROW(d.wireDecode(
312 "0630 0703080145 1400 16031B0100 1500 "
313 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
314 tlv::Error);
315 BOOST_CHECK_THROW(d.wireDecode(
316 "0630 0703080145 1400 1500 "
317 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 16031B0100"_block),
318 tlv::Error);
319 BOOST_CHECK_THROW(d.wireDecode(
320 "0652 0703080145 1400 1500 16031B0100 "
321 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"
322 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
323 tlv::Error);
324}
325
326BOOST_AUTO_TEST_CASE(NameMissing)
327{
328 BOOST_CHECK_THROW(d.wireDecode("0605 16031B0100"_block), tlv::Error);
329}
330
331BOOST_AUTO_TEST_CASE(SigInfoMissing)
332{
333 BOOST_CHECK_THROW(d.wireDecode("0605 0703080144"_block), tlv::Error);
334}
335
336BOOST_AUTO_TEST_CASE(UnrecognizedCriticalElement)
337{
338 BOOST_CHECK_THROW(d.wireDecode(
339 "0632 0703080145 FB00 1400 1500 16031B0100 "
340 "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
341 tlv::Error);
342}
343
344BOOST_AUTO_TEST_SUITE_END() // Decode03
345
Junxiao Shi81206d52017-07-23 12:43:22 +0000346BOOST_FIXTURE_TEST_CASE(FullName, IdentityManagementFixture)
347{
348 Data d(Name("/local/ndn/prefix"));
349 d.setContentType(tlv::ContentType_Blob);
Davide Pesavento0f830802018-01-16 23:58:58 -0500350 d.setFreshnessPeriod(10_s);
Junxiao Shi81206d52017-07-23 12:43:22 +0000351 d.setContent(CONTENT1, sizeof(CONTENT1));
352 BOOST_CHECK_THROW(d.getFullName(), Data::Error); // FullName is unavailable without signing
353
354 m_keyChain.sign(d);
355 BOOST_CHECK_EQUAL(d.hasWire(), true);
356 Name fullName = d.getFullName(); // FullName is available after signing
357
358 BOOST_CHECK_EQUAL(d.getName().size() + 1, fullName.size());
359 BOOST_CHECK_EQUAL_COLLECTIONS(d.getName().begin(), d.getName().end(),
360 fullName.begin(), fullName.end() - 1);
361 BOOST_CHECK_EQUAL(fullName.get(-1).value_size(), util::Sha256::DIGEST_SIZE);
362
363 // FullName should be cached, so value() pointer points to same memory location
364 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
365
Davide Pesavento0f830802018-01-16 23:58:58 -0500366 d.setFreshnessPeriod(100_s); // invalidates FullName
Junxiao Shi81206d52017-07-23 12:43:22 +0000367 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
368
369 Data d1(Block(DATA1, sizeof(DATA1)));
370 BOOST_CHECK_EQUAL(d1.getFullName(),
371 "/local/ndn/prefix/"
372 "sha256digest=28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548");
373}
374
375// ---- operators ----
376
377BOOST_AUTO_TEST_CASE(Equality)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700378{
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700379 Data a;
380 Data b;
381 BOOST_CHECK_EQUAL(a == b, true);
382 BOOST_CHECK_EQUAL(a != b, false);
383
384 a.setName("ndn:/A");
385 BOOST_CHECK_EQUAL(a == b, false);
386 BOOST_CHECK_EQUAL(a != b, true);
387
388 b.setName("ndn:/B");
389 BOOST_CHECK_EQUAL(a == b, false);
390 BOOST_CHECK_EQUAL(a != b, true);
391
392 b.setName("ndn:/A");
393 BOOST_CHECK_EQUAL(a == b, true);
394 BOOST_CHECK_EQUAL(a != b, false);
395
Davide Pesavento0f830802018-01-16 23:58:58 -0500396 a.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700397 BOOST_CHECK_EQUAL(a == b, false);
398 BOOST_CHECK_EQUAL(a != b, true);
399
Davide Pesavento0f830802018-01-16 23:58:58 -0500400 b.setFreshnessPeriod(10_s);
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700401 BOOST_CHECK_EQUAL(a == b, true);
402 BOOST_CHECK_EQUAL(a != b, false);
403
404 static const uint8_t someData[] = "someData";
405 a.setContent(someData, sizeof(someData));
406 BOOST_CHECK_EQUAL(a == b, false);
407 BOOST_CHECK_EQUAL(a != b, true);
408
409 b.setContent(someData, sizeof(someData));
410 BOOST_CHECK_EQUAL(a == b, true);
411 BOOST_CHECK_EQUAL(a != b, false);
412
413 a.setSignature(SignatureSha256WithRsa());
414 BOOST_CHECK_EQUAL(a == b, false);
415 BOOST_CHECK_EQUAL(a != b, true);
416
417 b.setSignature(SignatureSha256WithRsa());
418 BOOST_CHECK_EQUAL(a == b, true);
419 BOOST_CHECK_EQUAL(a != b, false);
420}
421
Junxiao Shi81206d52017-07-23 12:43:22 +0000422BOOST_AUTO_TEST_CASE(Print)
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700423{
Junxiao Shi81206d52017-07-23 12:43:22 +0000424 Data d(Block(DATA1, sizeof(DATA1)));
425 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(d),
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700426 "Name: /local/ndn/prefix\n"
427 "MetaInfo: ContentType: 0, FreshnessPeriod: 10000 milliseconds\n"
428 "Content: (size: 8)\n"
Junxiao Shi605671d2017-08-26 13:41:06 +0000429 "Signature: (type: SignatureSha256WithRsa, value_length: 128)\n");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800430}
431
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100432BOOST_AUTO_TEST_SUITE_END() // TestData
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800433
Spyridon Mastorakis429634f2015-02-19 17:35:33 -0800434} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800435} // namespace ndn