blob: 5c1c52af8b51a3741bf5b1e3e171930b2df164ae [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;
224 // BOOST_REQUIRE_NO_THROW
225 (d.wireDecode(dataBlock));
226
227 BOOST_REQUIRE_EQUAL(d.getName().toUri(), "/local/ndn/prefix");
228 BOOST_REQUIRE_EQUAL(d.getContentType(), static_cast<uint32_t>(MetaInfo::TYPE_DEFAULT));
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"));
257 d.setContentType(MetaInfo::TYPE_DEFAULT);
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 Afanasyev90df0002014-01-03 15:32:43 -0800265 signatureInfo.push_back
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600266 (nonNegativeIntegerBlock(tlv::SignatureType, Signature::Sha256WithRsa));
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800267 }
268 // KeyLocator
269 {
270 KeyLocator keyLocator;
271 keyLocator.setName("/test/key/locator");
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700272
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800273 signatureInfo.push_back(keyLocator.wireEncode());
274 }
275 signatureInfo.encode();
276
277 // SignatureValue
278 OBufferStream os;
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600279 tlv::writeVarNumber(os, tlv::SignatureValue);
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800280
281 using namespace CryptoPP;
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700282
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800283 RSASS<PKCS1v15, SHA256>::Signer signer(privateKey_);
284
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800285 PK_MessageAccumulator *hash = signer.NewSignatureAccumulator(rng_);
286 hash->Update(d.getName(). wireEncode().wire(), d.getName(). wireEncode().size());
287 hash->Update(d.getMetaInfo().wireEncode().wire(), d.getMetaInfo().wireEncode().size());
288 hash->Update(d.getContent(). wire(), d.getContent(). size());
289 hash->Update(signatureInfo. wire(), signatureInfo. size());
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700290
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800291 size_t length = signer.MaxSignatureLength();
292 SecByteBlock buf(length);
293 signer.Sign(rng_, hash, buf);
294
Steve DiBenedetto54ce6682014-07-22 13:22:57 -0600295 tlv::writeVarNumber(os, buf.size());
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700296 os.write(reinterpret_cast<const char *>(buf.BytePtr()), buf.size());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800297
Alexander Afanasyevff2d08f2014-04-07 18:28:25 -0700298 ndn::Block signatureValue(Block(os.buf()));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700299
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800300 Signature signature(signatureInfo, signatureValue);
301
302 d.setSignature(signature);
303
304 Block dataBlock;
305 BOOST_REQUIRE_NO_THROW(dataBlock = d.wireEncode());
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800306
307 BOOST_REQUIRE_EQUAL_COLLECTIONS(Data1, Data1+sizeof(Data1),
Alexander Afanasyev636e9f12014-01-07 12:01:03 -0800308 dataBlock.begin(), dataBlock.end());
Alexander Afanasyeva0c5f832014-06-19 13:27:56 -0700309
310 std::ostringstream strStream;
311 BOOST_CHECK_NO_THROW(strStream << d);
312
313 BOOST_CHECK_EQUAL(strStream.str(),
314 "Name: /local/ndn/prefix\n"
315 "MetaInfo: ContentType: 0, FreshnessPeriod: 10000 milliseconds\n"
316 "Content: (size: 8)\n"
317 "Signature: (type: 1, value_length: 128)\n");
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800318}
319
Alexander Afanasyev3b703102014-06-13 17:01:14 -0700320class DataIdentityFixture
321{
322public:
323 DataIdentityFixture()
324 : identity("/TestData")
325 {
326 identity.appendVersion();
327
328 BOOST_REQUIRE_NO_THROW(certName = keyChain.createIdentity(identity));
329 }
330
331 ~DataIdentityFixture()
332 {
333 BOOST_CHECK_NO_THROW(keyChain.deleteIdentity(identity));
334 }
335
336public:
337 KeyChain keyChain;
338 Name identity;
339 Name certName;
340};
341
342BOOST_FIXTURE_TEST_CASE(FullName, DataIdentityFixture)
343{
344 // Encoding pipeline
345
346 ndn::Data d(ndn::Name("/local/ndn/prefix"));
347 d.setContentType(MetaInfo::TYPE_DEFAULT);
348 d.setFreshnessPeriod(time::seconds(10));
349
350 d.setContent(Content1, sizeof(Content1));
351
352 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
353
354 keyChain.sign(d, certName);
355
356 Name fullName;
357 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
358
359 BOOST_CHECK_EQUAL(d.getName().hasWire(), true);
360 BOOST_CHECK_EQUAL(fullName.hasWire(), false);
361
362 // check if name was properly cached
363 BOOST_CHECK_EQUAL(fullName.get(-1).value(), d.getFullName().get(-1).value());
364
365 // check FullName content
366 BOOST_REQUIRE_EQUAL(d.getName().size() + 1, fullName.size());
367 BOOST_CHECK_EQUAL_COLLECTIONS(d.getName().begin(), d.getName().end(),
368 fullName.begin(), fullName.end() - 1);
369 BOOST_CHECK_EQUAL(fullName.get(-1).value_size(), 32);
370
371 // FullName should be reset after the next line
372 d.setFreshnessPeriod(time::seconds(100));
373 BOOST_CHECK_THROW(d.getFullName(), Data::Error);
374
375 // Decoding pipeline
376 d.wireDecode(Block(Data1, sizeof(Data1)));
377 BOOST_REQUIRE_NO_THROW(fullName = d.getFullName());
378
379 BOOST_CHECK_EQUAL(fullName.toUri(),
380 "/local/ndn/prefix/"
381 "%28%BA%D4%B5%27%5B%D3%92%DB%B6p%C7%5C%F0%B6o%13%F7%94+%21%E8%0FU%C0%E8k7GS%A5H");
382}
383
Alexander Afanasyev5fa9e9a2013-12-24 19:45:07 -0800384BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800385
386} // namespace ndn