blob: 51c075e8661f5678150b2e47432f2a2e241cd2fb [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/*
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -08003 * Copyright (c) 2013-2017 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"
Davide Pesaventoc2e12b42017-07-09 20:35:09 -040024#include "security/transform/private-key.hpp"
25#include "security/transform/public-key.hpp"
26#include "security/transform/signer-filter.hpp"
27#include "security/transform/step-source.hpp"
28#include "security/transform/stream-sink.hpp"
29#include "security/verification-helpers.hpp"
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080030
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070031#include "boost-test.hpp"
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -070032#include "identity-management-fixture.hpp"
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070033
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -080034namespace ndn {
Spyridon Mastorakis429634f2015-02-19 17:35:33 -080035namespace tests {
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080036
37BOOST_AUTO_TEST_SUITE(TestData)
38
39const uint8_t Content1[] = {0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21};
40
41const uint8_t Data1[] = {
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700420x06, 0xc5, // NDN Data
43 0x07, 0x14, // Name
44 0x08, 0x05,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080045 0x6c, 0x6f, 0x63, 0x61, 0x6c,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070046 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080047 0x6e, 0x64, 0x6e,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070048 0x08, 0x06,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080049 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080050 0x14, 0x04, // MetaInfo
51 0x19, 0x02, // FreshnessPeriod
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070052 0x27, 0x10,
53 0x15, 0x08, // Content
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080054 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080055 0x16, 0x1b, // SignatureInfo
56 0x1b, 0x01, // SignatureType
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070057 0x01,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080058 0x1c, 0x16, // KeyLocator
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070059 0x07, 0x14, // Name
60 0x08, 0x04,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080061 0x74, 0x65, 0x73, 0x74,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070062 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080063 0x6b, 0x65, 0x79,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070064 0x08, 0x07,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080065 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080066 0x17, 0x80, // SignatureValue
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070067 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
68 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
69 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
70 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
71 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
72 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
73 0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
74 0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
75 0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
76 0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080077};
78
79const unsigned char DEFAULT_PRIVATE_KEY_DER[] = {
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070080 0x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,
81 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82,
82 0x02, 0x5a, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e, 0x47, 0x85,
83 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47, 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05,
84 0x3a, 0x24, 0x1e, 0xeb, 0x89, 0x01, 0xbb, 0xe9, 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68,
85 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7, 0x06, 0x90, 0x9c, 0xaa,
86 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3, 0x1b, 0x88,
87 0x9a, 0x97, 0x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82,
88 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d, 0x24, 0xc2, 0x63, 0xf3, 0x97, 0x17,
89 0xeb, 0xfe, 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f,
90 0xb8, 0xf2, 0xf1, 0xc5, 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed,
91 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76, 0x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11,
92 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0, 0x2a, 0xe3, 0x6b, 0x0c, 0x8b, 0x73,
93 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c, 0x5b, 0x43, 0x29, 0xad,
94 0x3a, 0x3b, 0x93, 0xa3, 0x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e, 0x33, 0x3f,
95 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44, 0x00, 0xde, 0x72, 0xed,
96 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2,
97 0x69, 0x1f, 0xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13,
98 0x06, 0x69, 0x06, 0xd8, 0x3f, 0x22, 0x15, 0x75, 0xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66,
99 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2, 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37,
100 0x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88, 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f,
101 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02, 0x41, 0x00, 0xb6, 0x2e, 0xbb, 0xcd, 0x2f, 0x3a,
102 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e, 0x64, 0xa7,
103 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae,
104 0xb0, 0x74, 0xa6, 0x99, 0xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e,
105 0x56, 0xad, 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c, 0xb7, 0x9a, 0x3e, 0x99,
106 0xef, 0xb9, 0x02, 0x41, 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1,
107 0xac, 0xee, 0xcb, 0x41, 0x81, 0xc6, 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21,
108 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96, 0x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8,
109 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6, 0x90, 0xb5, 0xce, 0x1b,
110 0x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a, 0x7f, 0x02,
111 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0, 0x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89,
112 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee, 0x51, 0x57,
113 0xd5, 0x97, 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e,
114 0x88, 0x63, 0xe2, 0x66, 0x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a,
115 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca, 0x78, 0xab, 0x21, 0x02, 0x41, 0x00, 0x8f, 0xae,
116 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24, 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81,
117 0xbc, 0x2c, 0x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d, 0x28, 0xd9, 0x10, 0x1a,
118 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14, 0xbf, 0xc9, 0xff, 0x17, 0xd6, 0x47,
119 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
120 0xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a,
121 0x33, 0x2f, 0x4b, 0xa2, 0xbd, 0xd1, 0xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15,
122 0x37, 0x1b, 0xde, 0x76, 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9, 0x4f, 0x35,
123 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95, 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21,
124 0x6d, 0xa0, 0x84, 0x39, 0xe9, 0x2e, 0x1e, 0xfc, 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d,
125 0x0a, 0xb6
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800126};
127
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700128BOOST_AUTO_TEST_CASE(DataEqualityChecks)
129{
130 using namespace time;
131
132 Data a;
133 Data b;
134 BOOST_CHECK_EQUAL(a == b, true);
135 BOOST_CHECK_EQUAL(a != b, false);
136
137 a.setName("ndn:/A");
138 BOOST_CHECK_EQUAL(a == b, false);
139 BOOST_CHECK_EQUAL(a != b, true);
140
141 b.setName("ndn:/B");
142 BOOST_CHECK_EQUAL(a == b, false);
143 BOOST_CHECK_EQUAL(a != b, true);
144
145 b.setName("ndn:/A");
146 BOOST_CHECK_EQUAL(a == b, true);
147 BOOST_CHECK_EQUAL(a != b, false);
148
149 a.setFreshnessPeriod(seconds(10));
150 BOOST_CHECK_EQUAL(a == b, false);
151 BOOST_CHECK_EQUAL(a != b, true);
152
153 b.setFreshnessPeriod(seconds(10));
154 BOOST_CHECK_EQUAL(a == b, true);
155 BOOST_CHECK_EQUAL(a != b, false);
156
157 static const uint8_t someData[] = "someData";
158 a.setContent(someData, sizeof(someData));
159 BOOST_CHECK_EQUAL(a == b, false);
160 BOOST_CHECK_EQUAL(a != b, true);
161
162 b.setContent(someData, sizeof(someData));
163 BOOST_CHECK_EQUAL(a == b, true);
164 BOOST_CHECK_EQUAL(a != b, false);
165
166 a.setSignature(SignatureSha256WithRsa());
167 BOOST_CHECK_EQUAL(a == b, false);
168 BOOST_CHECK_EQUAL(a != b, true);
169
170 b.setSignature(SignatureSha256WithRsa());
171 BOOST_CHECK_EQUAL(a == b, true);
172 BOOST_CHECK_EQUAL(a != b, false);
173}
174
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700175BOOST_AUTO_TEST_CASE(SignatureEqualityChecks)
176{
177 Signature a;
178 Signature b;
179
180 BOOST_CHECK_EQUAL(a == b, true);
181 BOOST_CHECK_EQUAL(a != b, false);
182
183 a = SignatureSha256WithRsa();
184 BOOST_CHECK_EQUAL(a == b, false);
185 BOOST_CHECK_EQUAL(a != b, true);
186
187 b = SignatureSha256WithRsa();
188 static const uint8_t someData[256] = {};
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700189 Block signatureValue = makeBinaryBlock(tlv::SignatureValue, someData, sizeof(someData));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700190 b.setValue(signatureValue);
191 BOOST_CHECK_EQUAL(a == b, false);
192 BOOST_CHECK_EQUAL(a != b, true);
193
194 a.setValue(signatureValue);
195 BOOST_CHECK_EQUAL(a == b, true);
196 BOOST_CHECK_EQUAL(a != b, false);
197
Yingdi Yubf6a2812014-06-17 15:32:11 -0700198 a = DigestSha256();
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700199 b = SignatureSha256WithRsa();
200 BOOST_CHECK_EQUAL(a == b, false);
201 BOOST_CHECK_EQUAL(a != b, true);
202
Yingdi Yubf6a2812014-06-17 15:32:11 -0700203 b = DigestSha256();
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700204 BOOST_CHECK_EQUAL(a == b, true);
205 BOOST_CHECK_EQUAL(a != b, false);
206}
207
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800208class TestDataFixture
209{
Davide Pesaventoc2e12b42017-07-09 20:35:09 -0400210protected:
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800211 TestDataFixture()
212 {
Davide Pesaventoc2e12b42017-07-09 20:35:09 -0400213 m_privKey.loadPkcs1(DEFAULT_PRIVATE_KEY_DER, sizeof(DEFAULT_PRIVATE_KEY_DER));
214 auto buf = m_privKey.derivePublicKey();
215 m_pubKey.loadPkcs8(buf->data(), buf->size());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800216 }
217
218protected:
Davide Pesaventoc2e12b42017-07-09 20:35:09 -0400219 security::transform::PrivateKey m_privKey;
220 security::transform::PublicKey m_pubKey;
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800221};
222
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700223BOOST_FIXTURE_TEST_CASE(Decode, TestDataFixture)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800224{
225 Block dataBlock(Data1, sizeof(Data1));
Davide Pesaventoc2e12b42017-07-09 20:35:09 -0400226 Data d(dataBlock);
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700227
Davide Pesaventoc2e12b42017-07-09 20:35:09 -0400228 BOOST_CHECK_EQUAL(d.getName().toUri(), "/local/ndn/prefix");
229 BOOST_CHECK_EQUAL(d.getContentType(), static_cast<uint32_t>(tlv::ContentType_Blob));
230 BOOST_CHECK_EQUAL(d.getFreshnessPeriod(), time::seconds(10));
231 BOOST_CHECK_EQUAL(std::string(reinterpret_cast<const char*>(d.getContent().value()),
232 d.getContent().value_size()), "SUCCESS!");
233 BOOST_CHECK_EQUAL(d.getSignature().getType(), tlv::SignatureSha256WithRsa);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800234
Davide Pesaventoc2e12b42017-07-09 20:35:09 -0400235 Block block = d.getSignature().getInfo();
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800236 block.parse();
Davide Pesaventoc2e12b42017-07-09 20:35:09 -0400237 KeyLocator keyLocator(block.get(tlv::KeyLocator));
238 BOOST_CHECK_EQUAL(keyLocator.getName().toUri(), "/test/key/locator");
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700239
Davide Pesaventoc2e12b42017-07-09 20:35:09 -0400240 BOOST_CHECK(security::verifySignature(d, m_pubKey));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800241}
242
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700243BOOST_FIXTURE_TEST_CASE(Encode, TestDataFixture)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800244{
245 // manual data packet creation for now
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700246
Davide Pesaventoc2e12b42017-07-09 20:35:09 -0400247 Data d(Name("/local/ndn/prefix"));
Junxiao Shia464b922014-11-12 21:13:06 -0700248 d.setContentType(tlv::ContentType_Blob);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700249 d.setFreshnessPeriod(time::seconds(10));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800250 d.setContent(Content1, sizeof(Content1));
251
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600252 Block signatureInfo(tlv::SignatureInfo);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800253 // SignatureType
Davide Pesaventoc2e12b42017-07-09 20:35:09 -0400254 signatureInfo.push_back(makeNonNegativeIntegerBlock(tlv::SignatureType, tlv::SignatureSha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800255 // KeyLocator
256 {
257 KeyLocator keyLocator;
258 keyLocator.setName("/test/key/locator");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800259 signatureInfo.push_back(keyLocator.wireEncode());
260 }
261 signatureInfo.encode();
262
263 // SignatureValue
264 OBufferStream os;
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600265 tlv::writeVarNumber(os, tlv::SignatureValue);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800266
Davide Pesaventoc2e12b42017-07-09 20:35:09 -0400267 OBufferStream sig;
268 {
269 namespace tr = security::transform;
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700270
Davide Pesaventoc2e12b42017-07-09 20:35:09 -0400271 tr::StepSource input;
272 input >> tr::signerFilter(DigestAlgorithm::SHA256, m_privKey) >> tr::streamSink(sig);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800273
Davide Pesaventoc2e12b42017-07-09 20:35:09 -0400274 input.write(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
275 input.write(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
276 input.write(d.getContent(). wire(), d.getContent(). size());
277 input.write(signatureInfo. wire(), signatureInfo. size());
278 input.end();
279 }
280 auto buf = sig.buf();
281 tlv::writeVarNumber(os, buf->size());
282 os.write(reinterpret_cast<const char*>(buf->data()), buf->size());
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700283
Davide Pesaventoc2e12b42017-07-09 20:35:09 -0400284 Block signatureValue(os.buf());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800285 Signature signature(signatureInfo, signatureValue);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800286 d.setSignature(signature);
287
Davide Pesaventoc2e12b42017-07-09 20:35:09 -0400288 Block dataBlock(d.wireEncode());
289 BOOST_CHECK_EQUAL_COLLECTIONS(Data1, Data1 + sizeof(Data1),
290 dataBlock.begin(), dataBlock.end());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800291
Davide Pesaventoc2e12b42017-07-09 20:35:09 -0400292 std::ostringstream ss;
293 ss << d;
294 BOOST_CHECK_EQUAL(ss.str(),
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700295 "Name: /local/ndn/prefix\n"
296 "MetaInfo: ContentType: 0, FreshnessPeriod: 10000 milliseconds\n"
297 "Content: (size: 8)\n"
298 "Signature: (type: 1, value_length: 128)\n");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800299}
300
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -0700301BOOST_FIXTURE_TEST_CASE(FullName, IdentityManagementFixture)
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700302{
303 // Encoding pipeline
304
Davide Pesaventoc2e12b42017-07-09 20:35:09 -0400305 Data d(Name("/local/ndn/prefix"));
Junxiao Shia464b922014-11-12 21:13:06 -0700306 d.setContentType(tlv::ContentType_Blob);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700307 d.setFreshnessPeriod(time::seconds(10));
308
309 d.setContent(Content1, sizeof(Content1));
310
311 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
312
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -0700313 m_keyChain.sign(d);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700314
315 Name fullName;
316 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
317
318 BOOST_CHECK_EQUAL(d.getName().hasWire(), true);
319 BOOST_CHECK_EQUAL(fullName.hasWire(), false);
320
321 // check if name was properly cached
322 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
323
324 // check FullName content
325 BOOST_REQUIRE_EQUAL(d.getName().size() + 1, fullName.size());
326 BOOST_CHECK_EQUAL_COLLECTIONS(d.getName().begin(), d.getName().end(),
327 fullName.begin(), fullName.end() - 1);
328 BOOST_CHECK_EQUAL(fullName.get(-1).value_size(), 32);
329
330 // FullName should be reset after the next line
331 d.setFreshnessPeriod(time::seconds(100));
332 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
333
334 // Decoding pipeline
335 d.wireDecode(Block(Data1, sizeof(Data1)));
336 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
337
338 BOOST_CHECK_EQUAL(fullName.toUri(),
339 "/local/ndn/prefix/"
Alexander Afanasyevafee0a52014-11-07 11:15:34 -0800340 "sha256digest=28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548");
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700341}
342
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100343BOOST_AUTO_TEST_SUITE_END() // TestData
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800344
Spyridon Mastorakis429634f2015-02-19 17:35:33 -0800345} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800346} // namespace ndn