blob: 7f209819bbde3edb0b40f9f388d2eb117ac6e1ce [file] [log] [blame]
Yingdi Yuebfa4cb2014-06-17 15:28:53 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -08003 * Copyright (c) 2013-2017 Regents of the University of California.
Yingdi Yuebfa4cb2014-06-17 15:28:53 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6 *
7 * 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.
20 */
21
22#include "security/signature-sha256-with-ecdsa.hpp"
Yingdi Yu6ab67812014-11-27 15:00:34 -080023#include "security/validator.hpp"
24#include "util/scheduler.hpp"
Davide Pesaventoeee3e822016-11-26 19:19:34 +010025
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070026#include "boost-test.hpp"
Davide Pesaventoeee3e822016-11-26 19:19:34 +010027#include "../identity-management-time-fixture.hpp"
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070028
29namespace ndn {
Yingdi Yu6ab67812014-11-27 15:00:34 -080030namespace tests {
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070031
Davide Pesaventoeee3e822016-11-26 19:19:34 +010032class SignatureSha256EcdsaTimeFixture : public IdentityManagementTimeFixture
Yingdi Yu6ab67812014-11-27 15:00:34 -080033{
34public:
35 SignatureSha256EcdsaTimeFixture()
36 : scheduler(io)
37 {
38 }
39
40public:
41 Scheduler scheduler;
42};
43
Davide Pesaventoeee3e822016-11-26 19:19:34 +010044BOOST_AUTO_TEST_SUITE(Security)
45BOOST_FIXTURE_TEST_SUITE(TestSignatureSha256WithEcdsa, SignatureSha256EcdsaTimeFixture)
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070046
47const uint8_t sigInfo[] = {
480x16, 0x1b, // SignatureInfo
49 0x1b, 0x01, // SignatureType
50 0x03,
51 0x1c, 0x16, // KeyLocator
52 0x07, 0x14, // Name
53 0x08, 0x04,
54 0x74, 0x65, 0x73, 0x74,
55 0x08, 0x03,
56 0x6b, 0x65, 0x79,
57 0x08, 0x07,
58 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72
59};
60
61const uint8_t sigValue[] = {
620x17, 0x40, // SignatureValue
63 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
68};
69
70
71BOOST_AUTO_TEST_CASE(Decoding)
72{
73 Block sigInfoBlock(sigInfo, sizeof(sigInfo));
74 Block sigValueBlock(sigValue, sizeof(sigValue));
75
76 Signature sig(sigInfoBlock, sigValueBlock);
Yingdi Yu4a557052014-07-09 16:40:37 -070077 BOOST_CHECK_NO_THROW(SignatureSha256WithEcdsa(sig));
78 BOOST_CHECK_NO_THROW(sig.getKeyLocator());
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070079}
80
81BOOST_AUTO_TEST_CASE(Encoding)
82{
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070083 Name name("/test/key/locator");
84 KeyLocator keyLocator(name);
85
Yingdi Yu4a557052014-07-09 16:40:37 -070086 SignatureSha256WithEcdsa sig(keyLocator);
87
88 BOOST_CHECK_NO_THROW(sig.getKeyLocator());
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070089
90 const Block& encodeSigInfoBlock = sig.getInfo();
91
92 Block sigInfoBlock(sigInfo, sizeof(sigInfo));
93
94 BOOST_CHECK_EQUAL_COLLECTIONS(sigInfoBlock.wire(),
95 sigInfoBlock.wire() + sigInfoBlock.size(),
96 encodeSigInfoBlock.wire(),
97 encodeSigInfoBlock.wire() + encodeSigInfoBlock.size());
Alexander Afanasyev1c6976d2014-07-13 11:40:50 -070098
99 sig.setKeyLocator(Name("/test/another/key/locator"));
100
101 const Block& encodeSigInfoBlock2 = sig.getInfo();
102 BOOST_CHECK(sigInfoBlock != encodeSigInfoBlock2);
Yingdi Yuebfa4cb2014-06-17 15:28:53 -0700103}
104
Yingdi Yu6ab67812014-11-27 15:00:34 -0800105BOOST_AUTO_TEST_CASE(DataSignature)
106{
107 Name identityName("/SecurityTestSignatureSha256WithEcdsa/DataSignature");
Alexander Afanasyevfc99b512017-01-04 11:10:36 -0800108 addIdentity(identityName, EcdsaKeyParams());
Alexander Afanasyev2fa59392016-07-29 17:24:23 -0700109 shared_ptr<security::v1::PublicKey> publicKey;
Yingdi Yu6ab67812014-11-27 15:00:34 -0800110 BOOST_REQUIRE_NO_THROW(publicKey = m_keyChain.getPublicKeyFromTpm(
111 m_keyChain.getDefaultKeyNameForIdentity(identityName)));
112
113 Data testData("/SecurityTestSignatureSha256WithEcdsa/DataSignature/Data1");
114 char content[5] = "1234";
115 testData.setContent(reinterpret_cast<uint8_t*>(content), 5);
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700116 BOOST_CHECK_NO_THROW(m_keyChain.sign(testData,
117 security::SigningInfo(security::SigningInfo::SIGNER_TYPE_ID,
118 identityName)));
Yingdi Yu6ab67812014-11-27 15:00:34 -0800119 Block dataBlock(testData.wireEncode().wire(), testData.wireEncode().size());
120
121 Data testData2;
122 testData2.wireDecode(dataBlock);
123 BOOST_CHECK(Validator::verifySignature(testData2, *publicKey));
124}
125
Yingdi Yu6ab67812014-11-27 15:00:34 -0800126BOOST_AUTO_TEST_CASE(InterestSignature)
127{
128 Name identityName("/SecurityTestSignatureSha256WithEcdsa/InterestSignature");
Alexander Afanasyevfc99b512017-01-04 11:10:36 -0800129 addIdentity(identityName, EcdsaKeyParams());
Alexander Afanasyev2fa59392016-07-29 17:24:23 -0700130 shared_ptr<security::v1::PublicKey> publicKey;
Yingdi Yu6ab67812014-11-27 15:00:34 -0800131 BOOST_REQUIRE_NO_THROW(publicKey = m_keyChain.getPublicKeyFromTpm(
132 m_keyChain.getDefaultKeyNameForIdentity(identityName)));
133
134
135 Interest interest("/SecurityTestSignatureSha256WithEcdsa/InterestSignature/Interest1");
136 Interest interest11("/SecurityTestSignatureSha256WithEcdsa/InterestSignature/Interest1");
137
138 scheduler.scheduleEvent(time::milliseconds(100), [&] {
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700139 BOOST_CHECK_NO_THROW(m_keyChain.sign(interest,
140 security::SigningInfo(security::SigningInfo::SIGNER_TYPE_ID,
141 identityName)));
Yingdi Yu6ab67812014-11-27 15:00:34 -0800142 });
143
144 advanceClocks(time::milliseconds(100));
145 scheduler.scheduleEvent(time::milliseconds(100), [&] {
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700146 BOOST_CHECK_NO_THROW(m_keyChain.sign(interest11,
147 security::SigningInfo(security::SigningInfo::SIGNER_TYPE_ID,
148 identityName)));
Yingdi Yu6ab67812014-11-27 15:00:34 -0800149 });
150
151 advanceClocks(time::milliseconds(100));
152
153 time::system_clock::TimePoint timestamp1 =
154 time::fromUnixTimestamp(
155 time::milliseconds(interest.getName().get(signed_interest::POS_TIMESTAMP).toNumber()));
156
157 time::system_clock::TimePoint timestamp2 =
158 time::fromUnixTimestamp(
159 time::milliseconds(interest11.getName().get(signed_interest::POS_TIMESTAMP).toNumber()));
160
161 BOOST_CHECK_EQUAL(time::milliseconds(100), (timestamp2 - timestamp1));
162
163 uint64_t nonce1 = interest.getName().get(signed_interest::POS_RANDOM_VAL).toNumber();
164 uint64_t nonce2 = interest11.getName().get(signed_interest::POS_RANDOM_VAL).toNumber();
165 BOOST_WARN_NE(nonce1, nonce2);
166
167 Block interestBlock(interest.wireEncode().wire(), interest.wireEncode().size());
168
169 Interest interest2;
170 interest2.wireDecode(interestBlock);
171 BOOST_CHECK(Validator::verifySignature(interest2, *publicKey));
172}
173
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100174BOOST_AUTO_TEST_SUITE_END() // TestSignatureSha256WithEcdsa
175BOOST_AUTO_TEST_SUITE_END() // Security
Yingdi Yuebfa4cb2014-06-17 15:28:53 -0700176
Yingdi Yu6ab67812014-11-27 15:00:34 -0800177} // namespace tests
Yingdi Yuebfa4cb2014-06-17 15:28:53 -0700178} // namespace ndn