blob: e2434168bb2a86a08227f712240cebe4cb95f799 [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/**
Spyridon Mastorakis429634f2015-02-19 17:35:33 -08003 * Copyright (c) 2013-2015 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"
28
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -080029namespace ndn {
Spyridon Mastorakis429634f2015-02-19 17:35:33 -080030namespace tests {
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080031
32BOOST_AUTO_TEST_SUITE(TestData)
33
34const uint8_t Content1[] = {0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21};
35
36const uint8_t Data1[] = {
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700370x06, 0xc5, // NDN Data
38 0x07, 0x14, // Name
39 0x08, 0x05,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080040 0x6c, 0x6f, 0x63, 0x61, 0x6c,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070041 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080042 0x6e, 0x64, 0x6e,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070043 0x08, 0x06,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080044 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080045 0x14, 0x04, // MetaInfo
46 0x19, 0x02, // FreshnessPeriod
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070047 0x27, 0x10,
48 0x15, 0x08, // Content
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080049 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080050 0x16, 0x1b, // SignatureInfo
51 0x1b, 0x01, // SignatureType
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070052 0x01,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080053 0x1c, 0x16, // KeyLocator
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070054 0x07, 0x14, // Name
55 0x08, 0x04,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080056 0x74, 0x65, 0x73, 0x74,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070057 0x08, 0x03,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080058 0x6b, 0x65, 0x79,
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070059 0x08, 0x07,
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080060 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
Alexander Afanasyev4b456282014-02-13 00:34:34 -080061 0x17, 0x80, // SignatureValue
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070062 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
63 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
64 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
65 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
66 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
67 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
68 0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
69 0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
70 0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
71 0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -080072};
73
74const unsigned char DEFAULT_PRIVATE_KEY_DER[] = {
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -070075 0x30, 0x82, 0x02, 0x74, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,
76 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x5e, 0x30, 0x82,
77 0x02, 0x5a, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x06, 0x3e, 0x47, 0x85,
78 0xb2, 0x34, 0x37, 0xaa, 0x85, 0x47, 0xac, 0x03, 0x24, 0x83, 0xb5, 0x9c, 0xa8, 0x05,
79 0x3a, 0x24, 0x1e, 0xeb, 0x89, 0x01, 0xbb, 0xe9, 0x9b, 0xb2, 0xc3, 0x22, 0xac, 0x68,
80 0xe3, 0xf0, 0x6c, 0x02, 0xce, 0x68, 0xa6, 0xc4, 0xd0, 0xa7, 0x06, 0x90, 0x9c, 0xaa,
81 0x1b, 0x08, 0x1d, 0x8b, 0x43, 0x9a, 0x33, 0x67, 0x44, 0x6d, 0x21, 0xa3, 0x1b, 0x88,
82 0x9a, 0x97, 0x5e, 0x59, 0xc4, 0x15, 0x0b, 0xd9, 0x2c, 0xbd, 0x51, 0x07, 0x61, 0x82,
83 0xad, 0xc1, 0xb8, 0xd7, 0xbf, 0x9b, 0xcf, 0x7d, 0x24, 0xc2, 0x63, 0xf3, 0x97, 0x17,
84 0xeb, 0xfe, 0x62, 0x25, 0xba, 0x5b, 0x4d, 0x8a, 0xc2, 0x7a, 0xbd, 0x43, 0x8a, 0x8f,
85 0xb8, 0xf2, 0xf1, 0xc5, 0x6a, 0x30, 0xd3, 0x50, 0x8c, 0xc8, 0x9a, 0xdf, 0xef, 0xed,
86 0x35, 0xe7, 0x7a, 0x62, 0xea, 0x76, 0x7c, 0xbb, 0x08, 0x26, 0xc7, 0x02, 0x01, 0x11,
87 0x02, 0x81, 0x80, 0x04, 0xa5, 0xd4, 0xa7, 0xc0, 0x2a, 0xe3, 0x6b, 0x0c, 0x8b, 0x73,
88 0x0c, 0x96, 0xae, 0x40, 0x1b, 0xee, 0x04, 0xf1, 0x18, 0x4c, 0x5b, 0x43, 0x29, 0xad,
89 0x3a, 0x3b, 0x93, 0xa3, 0x60, 0x17, 0x9b, 0xa8, 0xbb, 0x68, 0xf4, 0x1e, 0x33, 0x3f,
90 0x50, 0x32, 0xf7, 0x13, 0xf8, 0xa9, 0xe6, 0x7d, 0x79, 0x44, 0x00, 0xde, 0x72, 0xed,
91 0xf2, 0x73, 0xfa, 0x7b, 0xae, 0x2a, 0x71, 0xc0, 0x40, 0xc8, 0x37, 0x6f, 0x38, 0xb2,
92 0x69, 0x1f, 0xa8, 0x83, 0x7b, 0x42, 0x00, 0x73, 0x46, 0xe6, 0x4c, 0x91, 0x7f, 0x13,
93 0x06, 0x69, 0x06, 0xd8, 0x3f, 0x22, 0x15, 0x75, 0xf6, 0xde, 0xcd, 0xb0, 0xbc, 0x66,
94 0x61, 0x91, 0x08, 0x9b, 0x2b, 0xb2, 0x00, 0xa9, 0x67, 0x05, 0x39, 0x40, 0xb9, 0x37,
95 0x85, 0x88, 0x4f, 0x76, 0x79, 0x63, 0xc0, 0x88, 0x3c, 0x86, 0xa8, 0x12, 0x94, 0x5f,
96 0xe4, 0x36, 0x3d, 0xea, 0xb9, 0x02, 0x41, 0x00, 0xb6, 0x2e, 0xbb, 0xcd, 0x2f, 0x3a,
97 0x99, 0xe0, 0xa1, 0xa5, 0x44, 0x77, 0xea, 0x0b, 0xbe, 0x16, 0x95, 0x0e, 0x64, 0xa7,
98 0x68, 0xd7, 0x4b, 0x15, 0x15, 0x23, 0xe2, 0x1e, 0x4e, 0x00, 0x2c, 0x22, 0x97, 0xae,
99 0xb0, 0x74, 0xa6, 0x99, 0xd0, 0x5d, 0xb7, 0x1b, 0x10, 0x34, 0x13, 0xd2, 0x5f, 0x6e,
100 0x56, 0xad, 0x85, 0x4a, 0xdb, 0xf0, 0x78, 0xbd, 0xf4, 0x8c, 0xb7, 0x9a, 0x3e, 0x99,
101 0xef, 0xb9, 0x02, 0x41, 0x00, 0xde, 0x0d, 0xa7, 0x48, 0x75, 0x90, 0xad, 0x11, 0xa1,
102 0xac, 0xee, 0xcb, 0x41, 0x81, 0xc6, 0xc8, 0x7f, 0xe7, 0x25, 0x94, 0xa1, 0x2a, 0x21,
103 0xa8, 0x57, 0xfe, 0x84, 0xf2, 0x5e, 0xb4, 0x96, 0x35, 0xaf, 0xef, 0x2e, 0x7a, 0xf8,
104 0xda, 0x3f, 0xac, 0x8a, 0x3c, 0x1c, 0x9c, 0xbd, 0x44, 0xd6, 0x90, 0xb5, 0xce, 0x1b,
105 0x12, 0xf9, 0x3b, 0x8c, 0x69, 0xf6, 0xa9, 0x02, 0x93, 0x48, 0x35, 0x0a, 0x7f, 0x02,
106 0x40, 0x6b, 0x2a, 0x8c, 0x96, 0xd0, 0x7c, 0xd2, 0xfc, 0x9b, 0x52, 0x28, 0x46, 0x89,
107 0xac, 0x8d, 0xef, 0x2a, 0x80, 0xef, 0xea, 0x01, 0x6f, 0x95, 0x93, 0xee, 0x51, 0x57,
108 0xd5, 0x97, 0x4b, 0x65, 0x41, 0x86, 0x66, 0xc2, 0x26, 0x80, 0x1e, 0x3e, 0x55, 0x3e,
109 0x88, 0x63, 0xe2, 0x66, 0x03, 0x47, 0x31, 0xd8, 0xa2, 0x4e, 0x68, 0x45, 0x24, 0x0a,
110 0xca, 0x17, 0x61, 0xd5, 0x69, 0xca, 0x78, 0xab, 0x21, 0x02, 0x41, 0x00, 0x8f, 0xae,
111 0x7b, 0x4d, 0x00, 0xc7, 0x06, 0x92, 0xf0, 0x24, 0x9a, 0x83, 0x84, 0xbd, 0x62, 0x81,
112 0xbc, 0x2c, 0x27, 0x60, 0x2c, 0x0c, 0x33, 0xe5, 0x66, 0x1d, 0x28, 0xd9, 0x10, 0x1a,
113 0x7f, 0x4f, 0xea, 0x4f, 0x78, 0x6d, 0xb0, 0x14, 0xbf, 0xc9, 0xff, 0x17, 0xd6, 0x47,
114 0x4d, 0x4a, 0xa8, 0xf4, 0x39, 0x67, 0x3e, 0xb1, 0xec, 0x8f, 0xf1, 0x71, 0xbd, 0xb8,
115 0xa7, 0x50, 0x3d, 0xc7, 0xf7, 0xbb, 0x02, 0x40, 0x0d, 0x85, 0x32, 0x73, 0x9f, 0x0a,
116 0x33, 0x2f, 0x4b, 0xa2, 0xbd, 0xd1, 0xb1, 0x42, 0xf0, 0x72, 0xa8, 0x7a, 0xc8, 0x15,
117 0x37, 0x1b, 0xde, 0x76, 0x70, 0xce, 0xfd, 0x69, 0x20, 0x00, 0x4d, 0xc9, 0x4f, 0x35,
118 0x6f, 0xd1, 0x35, 0xa1, 0x04, 0x95, 0x30, 0xe8, 0x3b, 0xd5, 0x03, 0x5a, 0x50, 0x21,
119 0x6d, 0xa0, 0x84, 0x39, 0xe9, 0x2e, 0x1e, 0xfc, 0xe4, 0x82, 0x43, 0x20, 0x46, 0x7d,
120 0x0a, 0xb6
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800121};
122
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700123BOOST_AUTO_TEST_CASE(DataEqualityChecks)
124{
125 using namespace time;
126
127 Data a;
128 Data b;
129 BOOST_CHECK_EQUAL(a == b, true);
130 BOOST_CHECK_EQUAL(a != b, false);
131
132 a.setName("ndn:/A");
133 BOOST_CHECK_EQUAL(a == b, false);
134 BOOST_CHECK_EQUAL(a != b, true);
135
136 b.setName("ndn:/B");
137 BOOST_CHECK_EQUAL(a == b, false);
138 BOOST_CHECK_EQUAL(a != b, true);
139
140 b.setName("ndn:/A");
141 BOOST_CHECK_EQUAL(a == b, true);
142 BOOST_CHECK_EQUAL(a != b, false);
143
144 a.setFreshnessPeriod(seconds(10));
145 BOOST_CHECK_EQUAL(a == b, false);
146 BOOST_CHECK_EQUAL(a != b, true);
147
148 b.setFreshnessPeriod(seconds(10));
149 BOOST_CHECK_EQUAL(a == b, true);
150 BOOST_CHECK_EQUAL(a != b, false);
151
152 static const uint8_t someData[] = "someData";
153 a.setContent(someData, sizeof(someData));
154 BOOST_CHECK_EQUAL(a == b, false);
155 BOOST_CHECK_EQUAL(a != b, true);
156
157 b.setContent(someData, sizeof(someData));
158 BOOST_CHECK_EQUAL(a == b, true);
159 BOOST_CHECK_EQUAL(a != b, false);
160
161 a.setSignature(SignatureSha256WithRsa());
162 BOOST_CHECK_EQUAL(a == b, false);
163 BOOST_CHECK_EQUAL(a != b, true);
164
165 b.setSignature(SignatureSha256WithRsa());
166 BOOST_CHECK_EQUAL(a == b, true);
167 BOOST_CHECK_EQUAL(a != b, false);
168}
169
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700170BOOST_AUTO_TEST_CASE(SignatureEqualityChecks)
171{
172 Signature a;
173 Signature b;
174
175 BOOST_CHECK_EQUAL(a == b, true);
176 BOOST_CHECK_EQUAL(a != b, false);
177
178 a = SignatureSha256WithRsa();
179 BOOST_CHECK_EQUAL(a == b, false);
180 BOOST_CHECK_EQUAL(a != b, true);
181
182 b = SignatureSha256WithRsa();
183 static const uint8_t someData[256] = {};
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700184 Block signatureValue = makeBinaryBlock(tlv::SignatureValue, someData, sizeof(someData));
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700185 b.setValue(signatureValue);
186 BOOST_CHECK_EQUAL(a == b, false);
187 BOOST_CHECK_EQUAL(a != b, true);
188
189 a.setValue(signatureValue);
190 BOOST_CHECK_EQUAL(a == b, true);
191 BOOST_CHECK_EQUAL(a != b, false);
192
Yingdi Yubf6a2812014-06-17 15:32:11 -0700193 a = DigestSha256();
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700194 b = SignatureSha256WithRsa();
195 BOOST_CHECK_EQUAL(a == b, false);
196 BOOST_CHECK_EQUAL(a != b, true);
197
Yingdi Yubf6a2812014-06-17 15:32:11 -0700198 b = DigestSha256();
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700199 BOOST_CHECK_EQUAL(a == b, true);
200 BOOST_CHECK_EQUAL(a != b, false);
201}
202
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800203class TestDataFixture
204{
205public:
206 TestDataFixture()
207 {
208 CryptoPP::StringSource source(DEFAULT_PRIVATE_KEY_DER, sizeof(DEFAULT_PRIVATE_KEY_DER), true);
209 privateKey_.Load(source);
210 publicKey_ = privateKey_;
211 }
212
213protected:
214 CryptoPP::AutoSeededRandomPool rng_;
215 CryptoPP::RSA::PrivateKey privateKey_;
216 CryptoPP::RSA::PublicKey publicKey_;
217};
218
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700219BOOST_FIXTURE_TEST_CASE(Decode, TestDataFixture)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800220{
221 Block dataBlock(Data1, sizeof(Data1));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700222
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800223 ndn::Data d;
Alexander Afanasyevafee0a52014-11-07 11:15:34 -0800224 BOOST_REQUIRE_NO_THROW(d.wireDecode(dataBlock));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800225
226 BOOST_REQUIRE_EQUAL(d.getName().toUri(), "/local/ndn/prefix");
Junxiao Shia464b922014-11-12 21:13:06 -0700227 BOOST_REQUIRE_EQUAL(d.getContentType(), static_cast<uint32_t>(tlv::ContentType_Blob));
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700228 BOOST_REQUIRE_EQUAL(d.getFreshnessPeriod(), time::seconds(10));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800229
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700230 BOOST_REQUIRE_EQUAL(std::string(reinterpret_cast<const char*>(d.getContent().value()),
231 d.getContent().value_size()), "SUCCESS!");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800232
Alexander Afanasyev76c51562014-01-03 15:13:48 -0800233 BOOST_REQUIRE_EQUAL(d.getSignature().getType(), static_cast<uint32_t>(Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800234 ndn::Block block = d.getSignature().getInfo();
235 block.parse();
236 KeyLocator keyLocator;
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600237 BOOST_REQUIRE_NO_THROW(keyLocator.wireDecode(block.get(tlv::KeyLocator)));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700238
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800239 BOOST_REQUIRE_EQUAL(keyLocator.getName().toUri(), "/test/key/locator");
240
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700241 using namespace CryptoPP;
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800242 RSASS<PKCS1v15, SHA256>::Verifier verifier(publicKey_);
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -0700243 bool signatureVerified = verifier.VerifyMessage(d.wireEncode().value(),
244 d.wireEncode().value_size() -
245 d.getSignature().getValue().size(),
246 d.getSignature().getValue().value(),
247 d.getSignature().getValue().value_size());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800248 BOOST_REQUIRE_EQUAL(signatureVerified, true);
249}
250
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700251BOOST_FIXTURE_TEST_CASE(Encode, TestDataFixture)
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800252{
253 // manual data packet creation for now
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700254
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800255 ndn::Data d(ndn::Name("/local/ndn/prefix"));
Junxiao Shia464b922014-11-12 21:13:06 -0700256 d.setContentType(tlv::ContentType_Blob);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700257 d.setFreshnessPeriod(time::seconds(10));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700258
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800259 d.setContent(Content1, sizeof(Content1));
260
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600261 Block signatureInfo(tlv::SignatureInfo);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800262 // SignatureType
263 {
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -0700264 signatureInfo.push_back(makeNonNegativeIntegerBlock(tlv::SignatureType, Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800265 }
266 // KeyLocator
267 {
268 KeyLocator keyLocator;
269 keyLocator.setName("/test/key/locator");
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700270
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800271 signatureInfo.push_back(keyLocator.wireEncode());
272 }
273 signatureInfo.encode();
274
275 // SignatureValue
276 OBufferStream os;
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600277 tlv::writeVarNumber(os, tlv::SignatureValue);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800278
279 using namespace CryptoPP;
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700280
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800281 RSASS<PKCS1v15, SHA256>::Signer signer(privateKey_);
282
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800283 PK_MessageAccumulator *hash = signer.NewSignatureAccumulator(rng_);
284 hash->Update(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
285 hash->Update(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
286 hash->Update(d.getContent(). wire(), d.getContent(). size());
287 hash->Update(signatureInfo. wire(), signatureInfo. size());
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700288
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800289 size_t length = signer.MaxSignatureLength();
290 SecByteBlock buf(length);
291 signer.Sign(rng_, hash, buf);
292
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600293 tlv::writeVarNumber(os, buf.size());
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700294 os.write(reinterpret_cast<const char *>(buf.BytePtr()), buf.size());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800295
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700296 ndn::Block signatureValue(Block(os.buf()));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700297
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800298 Signature signature(signatureInfo, signatureValue);
299
300 d.setSignature(signature);
301
302 Block dataBlock;
303 BOOST_REQUIRE_NO_THROW(dataBlock = d.wireEncode());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800304
305 BOOST_REQUIRE_EQUAL_COLLECTIONS(Data1, Data1+sizeof(Data1),
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800306 dataBlock.begin(), dataBlock.end());
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700307
308 std::ostringstream strStream;
309 BOOST_CHECK_NO_THROW(strStream << d);
310
311 BOOST_CHECK_EQUAL(strStream.str(),
312 "Name: /local/ndn/prefix\n"
313 "MetaInfo: ContentType: 0, FreshnessPeriod: 10000 milliseconds\n"
314 "Content: (size: 8)\n"
315 "Signature: (type: 1, value_length: 128)\n");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800316}
317
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700318class DataIdentityFixture
319{
320public:
321 DataIdentityFixture()
322 : identity("/TestData")
323 {
324 identity.appendVersion();
325
326 BOOST_REQUIRE_NO_THROW(certName = keyChain.createIdentity(identity));
327 }
328
329 ~DataIdentityFixture()
330 {
331 BOOST_CHECK_NO_THROW(keyChain.deleteIdentity(identity));
332 }
333
334public:
335 KeyChain keyChain;
336 Name identity;
337 Name certName;
338};
339
340BOOST_FIXTURE_TEST_CASE(FullName, DataIdentityFixture)
341{
342 // Encoding pipeline
343
344 ndn::Data d(ndn::Name("/local/ndn/prefix"));
Junxiao Shia464b922014-11-12 21:13:06 -0700345 d.setContentType(tlv::ContentType_Blob);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700346 d.setFreshnessPeriod(time::seconds(10));
347
348 d.setContent(Content1, sizeof(Content1));
349
350 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
351
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700352 keyChain.sign(d, security::SigningInfo(security::SigningInfo::SIGNER_TYPE_CERT, certName));
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700353
354 Name fullName;
355 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
356
357 BOOST_CHECK_EQUAL(d.getName().hasWire(), true);
358 BOOST_CHECK_EQUAL(fullName.hasWire(), false);
359
360 // check if name was properly cached
361 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
362
363 // check FullName content
364 BOOST_REQUIRE_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(), 32);
368
369 // FullName should be reset after the next line
370 d.setFreshnessPeriod(time::seconds(100));
371 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
372
373 // Decoding pipeline
374 d.wireDecode(Block(Data1, sizeof(Data1)));
375 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
376
377 BOOST_CHECK_EQUAL(fullName.toUri(),
378 "/local/ndn/prefix/"
Alexander Afanasyevafee0a52014-11-07 11:15:34 -0800379 "sha256digest=28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548");
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700380}
381
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800382BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800383
Spyridon Mastorakis429634f2015-02-19 17:35:33 -0800384} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800385} // namespace ndn