blob: 19b349310ed28d0c4179b3dacb749ae8cb6640a2 [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -08002/**
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -07003 * Copyright (c) 2013-2016 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"
23#include "security/key-chain.hpp"
Junxiao Shi482ccc52014-03-31 13:05:24 -070024#include "security/cryptopp.hpp"
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -070025#include "encoding/buffer-stream.hpp"
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080026
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070027#include "boost-test.hpp"
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -070028#include "identity-management-fixture.hpp"
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070029
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -080030namespace ndn {
Spyridon Mastorakis429634f2015-02-19 17:35:33 -080031namespace tests {
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080032
33BOOST_AUTO_TEST_SUITE(TestData)
34
35const uint8_t Content1[] = {0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21};
36
37const uint8_t Data1[] = {
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700380x06, 0xc5, // NDN Data
39 0x07, 0x14, // Name
40 0x08, 0x05,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080041 0x6c, 0x6f, 0x63, 0x61, 0x6c,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070042 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080043 0x6e, 0x64, 0x6e,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070044 0x08, 0x06,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080045 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080046 0x14, 0x04, // MetaInfo
47 0x19, 0x02, // FreshnessPeriod
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070048 0x27, 0x10,
49 0x15, 0x08, // Content
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080050 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080051 0x16, 0x1b, // SignatureInfo
52 0x1b, 0x01, // SignatureType
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070053 0x01,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080054 0x1c, 0x16, // KeyLocator
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070055 0x07, 0x14, // Name
56 0x08, 0x04,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080057 0x74, 0x65, 0x73, 0x74,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070058 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080059 0x6b, 0x65, 0x79,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070060 0x08, 0x07,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080061 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080062 0x17, 0x80, // SignatureValue
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070063 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
64 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
65 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
66 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
67 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
68 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
69 0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
70 0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
71 0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
72 0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080073};
74
75const unsigned char DEFAULT_PRIVATE_KEY_DER[] = {
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070076 0x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,
77 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82,
78 0x02, 0x5a, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e, 0x47, 0x85,
79 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47, 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05,
80 0x3a, 0x24, 0x1e, 0xeb, 0x89, 0x01, 0xbb, 0xe9, 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68,
81 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7, 0x06, 0x90, 0x9c, 0xaa,
82 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3, 0x1b, 0x88,
83 0x9a, 0x97, 0x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82,
84 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d, 0x24, 0xc2, 0x63, 0xf3, 0x97, 0x17,
85 0xeb, 0xfe, 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f,
86 0xb8, 0xf2, 0xf1, 0xc5, 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed,
87 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76, 0x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11,
88 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0, 0x2a, 0xe3, 0x6b, 0x0c, 0x8b, 0x73,
89 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c, 0x5b, 0x43, 0x29, 0xad,
90 0x3a, 0x3b, 0x93, 0xa3, 0x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e, 0x33, 0x3f,
91 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44, 0x00, 0xde, 0x72, 0xed,
92 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2,
93 0x69, 0x1f, 0xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13,
94 0x06, 0x69, 0x06, 0xd8, 0x3f, 0x22, 0x15, 0x75, 0xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66,
95 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2, 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37,
96 0x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88, 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f,
97 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02, 0x41, 0x00, 0xb6, 0x2e, 0xbb, 0xcd, 0x2f, 0x3a,
98 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e, 0x64, 0xa7,
99 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae,
100 0xb0, 0x74, 0xa6, 0x99, 0xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e,
101 0x56, 0xad, 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c, 0xb7, 0x9a, 0x3e, 0x99,
102 0xef, 0xb9, 0x02, 0x41, 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1,
103 0xac, 0xee, 0xcb, 0x41, 0x81, 0xc6, 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21,
104 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96, 0x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8,
105 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6, 0x90, 0xb5, 0xce, 0x1b,
106 0x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a, 0x7f, 0x02,
107 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0, 0x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89,
108 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee, 0x51, 0x57,
109 0xd5, 0x97, 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e,
110 0x88, 0x63, 0xe2, 0x66, 0x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a,
111 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca, 0x78, 0xab, 0x21, 0x02, 0x41, 0x00, 0x8f, 0xae,
112 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24, 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81,
113 0xbc, 0x2c, 0x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d, 0x28, 0xd9, 0x10, 0x1a,
114 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14, 0xbf, 0xc9, 0xff, 0x17, 0xd6, 0x47,
115 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
116 0xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a,
117 0x33, 0x2f, 0x4b, 0xa2, 0xbd, 0xd1, 0xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15,
118 0x37, 0x1b, 0xde, 0x76, 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9, 0x4f, 0x35,
119 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95, 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21,
120 0x6d, 0xa0, 0x84, 0x39, 0xe9, 0x2e, 0x1e, 0xfc, 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d,
121 0x0a, 0xb6
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800122};
123
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700124BOOST_AUTO_TEST_CASE(DataEqualityChecks)
125{
126 using namespace time;
127
128 Data a;
129 Data b;
130 BOOST_CHECK_EQUAL(a == b, true);
131 BOOST_CHECK_EQUAL(a != b, false);
132
133 a.setName("ndn:/A");
134 BOOST_CHECK_EQUAL(a == b, false);
135 BOOST_CHECK_EQUAL(a != b, true);
136
137 b.setName("ndn:/B");
138 BOOST_CHECK_EQUAL(a == b, false);
139 BOOST_CHECK_EQUAL(a != b, true);
140
141 b.setName("ndn:/A");
142 BOOST_CHECK_EQUAL(a == b, true);
143 BOOST_CHECK_EQUAL(a != b, false);
144
145 a.setFreshnessPeriod(seconds(10));
146 BOOST_CHECK_EQUAL(a == b, false);
147 BOOST_CHECK_EQUAL(a != b, true);
148
149 b.setFreshnessPeriod(seconds(10));
150 BOOST_CHECK_EQUAL(a == b, true);
151 BOOST_CHECK_EQUAL(a != b, false);
152
153 static const uint8_t someData[] = "someData";
154 a.setContent(someData, sizeof(someData));
155 BOOST_CHECK_EQUAL(a == b, false);
156 BOOST_CHECK_EQUAL(a != b, true);
157
158 b.setContent(someData, sizeof(someData));
159 BOOST_CHECK_EQUAL(a == b, true);
160 BOOST_CHECK_EQUAL(a != b, false);
161
162 a.setSignature(SignatureSha256WithRsa());
163 BOOST_CHECK_EQUAL(a == b, false);
164 BOOST_CHECK_EQUAL(a != b, true);
165
166 b.setSignature(SignatureSha256WithRsa());
167 BOOST_CHECK_EQUAL(a == b, true);
168 BOOST_CHECK_EQUAL(a != b, false);
169}
170
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700171BOOST_AUTO_TEST_CASE(SignatureEqualityChecks)
172{
173 Signature a;
174 Signature b;
175
176 BOOST_CHECK_EQUAL(a == b, true);
177 BOOST_CHECK_EQUAL(a != b, false);
178
179 a = SignatureSha256WithRsa();
180 BOOST_CHECK_EQUAL(a == b, false);
181 BOOST_CHECK_EQUAL(a != b, true);
182
183 b = SignatureSha256WithRsa();
184 static const uint8_t someData[256] = {};
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700185 Block signatureValue = makeBinaryBlock(tlv::SignatureValue, someData, sizeof(someData));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700186 b.setValue(signatureValue);
187 BOOST_CHECK_EQUAL(a == b, false);
188 BOOST_CHECK_EQUAL(a != b, true);
189
190 a.setValue(signatureValue);
191 BOOST_CHECK_EQUAL(a == b, true);
192 BOOST_CHECK_EQUAL(a != b, false);
193
Yingdi Yubf6a2812014-06-17 15:32:11 -0700194 a = DigestSha256();
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700195 b = SignatureSha256WithRsa();
196 BOOST_CHECK_EQUAL(a == b, false);
197 BOOST_CHECK_EQUAL(a != b, true);
198
Yingdi Yubf6a2812014-06-17 15:32:11 -0700199 b = DigestSha256();
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700200 BOOST_CHECK_EQUAL(a == b, true);
201 BOOST_CHECK_EQUAL(a != b, false);
202}
203
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800204class TestDataFixture
205{
206public:
207 TestDataFixture()
208 {
209 CryptoPP::StringSource source(DEFAULT_PRIVATE_KEY_DER, sizeof(DEFAULT_PRIVATE_KEY_DER), true);
210 privateKey_.Load(source);
211 publicKey_ = privateKey_;
212 }
213
214protected:
215 CryptoPP::AutoSeededRandomPool rng_;
216 CryptoPP::RSA::PrivateKey privateKey_;
217 CryptoPP::RSA::PublicKey publicKey_;
218};
219
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700220BOOST_FIXTURE_TEST_CASE(Decode, TestDataFixture)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800221{
222 Block dataBlock(Data1, sizeof(Data1));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700223
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800224 ndn::Data d;
Alexander Afanasyevafee0a52014-11-07 11:15:34 -0800225 BOOST_REQUIRE_NO_THROW(d.wireDecode(dataBlock));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800226
227 BOOST_REQUIRE_EQUAL(d.getName().toUri(), "/local/ndn/prefix");
Junxiao Shia464b922014-11-12 21:13:06 -0700228 BOOST_REQUIRE_EQUAL(d.getContentType(), static_cast<uint32_t>(tlv::ContentType_Blob));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700229 BOOST_REQUIRE_EQUAL(d.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800230
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700231 BOOST_REQUIRE_EQUAL(std::string(reinterpret_cast<const char*>(d.getContent().value()),
232 d.getContent().value_size()), "SUCCESS!");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800233
Alexander Afanasyev76c51562014-01-03 15:13:48 -0800234 BOOST_REQUIRE_EQUAL(d.getSignature().getType(), static_cast<uint32_t>(Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800235 ndn::Block block = d.getSignature().getInfo();
236 block.parse();
237 KeyLocator keyLocator;
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600238 BOOST_REQUIRE_NO_THROW(keyLocator.wireDecode(block.get(tlv::KeyLocator)));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700239
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800240 BOOST_REQUIRE_EQUAL(keyLocator.getName().toUri(), "/test/key/locator");
241
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700242 using namespace CryptoPP;
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800243 RSASS<PKCS1v15, SHA256>::Verifier verifier(publicKey_);
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700244 bool signatureVerified = verifier.VerifyMessage(d.wireEncode().value(),
245 d.wireEncode().value_size() -
246 d.getSignature().getValue().size(),
247 d.getSignature().getValue().value(),
248 d.getSignature().getValue().value_size());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800249 BOOST_REQUIRE_EQUAL(signatureVerified, true);
250}
251
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700252BOOST_FIXTURE_TEST_CASE(Encode, TestDataFixture)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800253{
254 // manual data packet creation for now
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700255
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800256 ndn::Data d(ndn::Name("/local/ndn/prefix"));
Junxiao Shia464b922014-11-12 21:13:06 -0700257 d.setContentType(tlv::ContentType_Blob);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700258 d.setFreshnessPeriod(time::seconds(10));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700259
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800260 d.setContent(Content1, sizeof(Content1));
261
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600262 Block signatureInfo(tlv::SignatureInfo);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800263 // SignatureType
264 {
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700265 signatureInfo.push_back(makeNonNegativeIntegerBlock(tlv::SignatureType, Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800266 }
267 // KeyLocator
268 {
269 KeyLocator keyLocator;
270 keyLocator.setName("/test/key/locator");
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700271
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800272 signatureInfo.push_back(keyLocator.wireEncode());
273 }
274 signatureInfo.encode();
275
276 // SignatureValue
277 OBufferStream os;
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600278 tlv::writeVarNumber(os, tlv::SignatureValue);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800279
280 using namespace CryptoPP;
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700281
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800282 RSASS<PKCS1v15, SHA256>::Signer signer(privateKey_);
283
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800284 PK_MessageAccumulator *hash = signer.NewSignatureAccumulator(rng_);
285 hash->Update(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
286 hash->Update(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
287 hash->Update(d.getContent(). wire(), d.getContent(). size());
288 hash->Update(signatureInfo. wire(), signatureInfo. size());
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700289
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800290 size_t length = signer.MaxSignatureLength();
291 SecByteBlock buf(length);
292 signer.Sign(rng_, hash, buf);
293
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600294 tlv::writeVarNumber(os, buf.size());
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700295 os.write(reinterpret_cast<const char *>(buf.BytePtr()), buf.size());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800296
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700297 ndn::Block signatureValue(Block(os.buf()));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700298
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800299 Signature signature(signatureInfo, signatureValue);
300
301 d.setSignature(signature);
302
303 Block dataBlock;
304 BOOST_REQUIRE_NO_THROW(dataBlock = d.wireEncode());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800305
306 BOOST_REQUIRE_EQUAL_COLLECTIONS(Data1, Data1+sizeof(Data1),
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800307 dataBlock.begin(), dataBlock.end());
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700308
309 std::ostringstream strStream;
310 BOOST_CHECK_NO_THROW(strStream << d);
311
312 BOOST_CHECK_EQUAL(strStream.str(),
313 "Name: /local/ndn/prefix\n"
314 "MetaInfo: ContentType: 0, FreshnessPeriod: 10000 milliseconds\n"
315 "Content: (size: 8)\n"
316 "Signature: (type: 1, value_length: 128)\n");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800317}
318
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -0700319BOOST_FIXTURE_TEST_CASE(FullName, IdentityManagementFixture)
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700320{
321 // Encoding pipeline
322
323 ndn::Data d(ndn::Name("/local/ndn/prefix"));
Junxiao Shia464b922014-11-12 21:13:06 -0700324 d.setContentType(tlv::ContentType_Blob);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700325 d.setFreshnessPeriod(time::seconds(10));
326
327 d.setContent(Content1, sizeof(Content1));
328
329 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
330
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -0700331 m_keyChain.sign(d);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700332
333 Name fullName;
334 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
335
336 BOOST_CHECK_EQUAL(d.getName().hasWire(), true);
337 BOOST_CHECK_EQUAL(fullName.hasWire(), false);
338
339 // check if name was properly cached
340 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
341
342 // check FullName content
343 BOOST_REQUIRE_EQUAL(d.getName().size() + 1, fullName.size());
344 BOOST_CHECK_EQUAL_COLLECTIONS(d.getName().begin(), d.getName().end(),
345 fullName.begin(), fullName.end() - 1);
346 BOOST_CHECK_EQUAL(fullName.get(-1).value_size(), 32);
347
348 // FullName should be reset after the next line
349 d.setFreshnessPeriod(time::seconds(100));
350 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
351
352 // Decoding pipeline
353 d.wireDecode(Block(Data1, sizeof(Data1)));
354 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
355
356 BOOST_CHECK_EQUAL(fullName.toUri(),
357 "/local/ndn/prefix/"
Alexander Afanasyevafee0a52014-11-07 11:15:34 -0800358 "sha256digest=28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548");
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700359}
360
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800361BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800362
Spyridon Mastorakis429634f2015-02-19 17:35:33 -0800363} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800364} // namespace ndn