blob: 2493b8933adc3969daabe1c58504bd355c9c2332 [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 Afanasyevc169a812014-05-20 20:37:29 -04003 * Copyright (c) 2013-2014 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 Afanasyev5fa9e9a2013-12-24 19:45:07 -080029using namespace std;
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -080030namespace ndn {
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] = {};
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600184 Block signatureValue = dataBlock(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 Afanasyev90df0002014-01-03 15:32:43 -0800264 signatureInfo.push_back
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600265 (nonNegativeIntegerBlock(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 Afanasyev3b703102014-06-13 17:01:14 -0700319class DataIdentityFixture
320{
321public:
322 DataIdentityFixture()
323 : identity("/TestData")
324 {
325 identity.appendVersion();
326
327 BOOST_REQUIRE_NO_THROW(certName = keyChain.createIdentity(identity));
328 }
329
330 ~DataIdentityFixture()
331 {
332 BOOST_CHECK_NO_THROW(keyChain.deleteIdentity(identity));
333 }
334
335public:
336 KeyChain keyChain;
337 Name identity;
338 Name certName;
339};
340
341BOOST_FIXTURE_TEST_CASE(FullName, DataIdentityFixture)
342{
343 // Encoding pipeline
344
345 ndn::Data d(ndn::Name("/local/ndn/prefix"));
Junxiao Shia464b922014-11-12 21:13:06 -0700346 d.setContentType(tlv::ContentType_Blob);
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700347 d.setFreshnessPeriod(time::seconds(10));
348
349 d.setContent(Content1, sizeof(Content1));
350
351 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
352
353 keyChain.sign(d, certName);
354
355 Name fullName;
356 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
357
358 BOOST_CHECK_EQUAL(d.getName().hasWire(), true);
359 BOOST_CHECK_EQUAL(fullName.hasWire(), false);
360
361 // check if name was properly cached
362 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
363
364 // check FullName content
365 BOOST_REQUIRE_EQUAL(d.getName().size() + 1, fullName.size());
366 BOOST_CHECK_EQUAL_COLLECTIONS(d.getName().begin(), d.getName().end(),
367 fullName.begin(), fullName.end() - 1);
368 BOOST_CHECK_EQUAL(fullName.get(-1).value_size(), 32);
369
370 // FullName should be reset after the next line
371 d.setFreshnessPeriod(time::seconds(100));
372 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
373
374 // Decoding pipeline
375 d.wireDecode(Block(Data1, sizeof(Data1)));
376 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
377
378 BOOST_CHECK_EQUAL(fullName.toUri(),
379 "/local/ndn/prefix/"
Alexander Afanasyevafee0a52014-11-07 11:15:34 -0800380 "sha256digest=28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548");
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700381}
382
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800383BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800384
385} // namespace ndn