blob: 448734b06d7f0b472396526053c8c2ccfe3b8762 [file] [log] [blame]
Yingdi Yuebfa4cb2014-06-17 15:28:53 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -07003 * Copyright (c) 2013-2016 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/key-chain.hpp"
24#include "security/validator.hpp"
25#include "util/scheduler.hpp"
Davide Pesaventoeee3e822016-11-26 19:19:34 +010026
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070027#include "boost-test.hpp"
Davide Pesaventoeee3e822016-11-26 19:19:34 +010028#include "../identity-management-time-fixture.hpp"
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070029
30namespace ndn {
Yingdi Yu6ab67812014-11-27 15:00:34 -080031namespace tests {
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070032
Davide Pesaventoeee3e822016-11-26 19:19:34 +010033class SignatureSha256EcdsaTimeFixture : public IdentityManagementTimeFixture
Yingdi Yu6ab67812014-11-27 15:00:34 -080034{
35public:
36 SignatureSha256EcdsaTimeFixture()
37 : scheduler(io)
38 {
39 }
40
41public:
42 Scheduler scheduler;
43};
44
Davide Pesaventoeee3e822016-11-26 19:19:34 +010045BOOST_AUTO_TEST_SUITE(Security)
46BOOST_FIXTURE_TEST_SUITE(TestSignatureSha256WithEcdsa, SignatureSha256EcdsaTimeFixture)
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070047
48const uint8_t sigInfo[] = {
490x16, 0x1b, // SignatureInfo
50 0x1b, 0x01, // SignatureType
51 0x03,
52 0x1c, 0x16, // KeyLocator
53 0x07, 0x14, // Name
54 0x08, 0x04,
55 0x74, 0x65, 0x73, 0x74,
56 0x08, 0x03,
57 0x6b, 0x65, 0x79,
58 0x08, 0x07,
59 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72
60};
61
62const uint8_t sigValue[] = {
630x17, 0x40, // SignatureValue
64 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
65 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
66 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
67 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
68 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b
69};
70
71
72BOOST_AUTO_TEST_CASE(Decoding)
73{
74 Block sigInfoBlock(sigInfo, sizeof(sigInfo));
75 Block sigValueBlock(sigValue, sizeof(sigValue));
76
77 Signature sig(sigInfoBlock, sigValueBlock);
Yingdi Yu4a557052014-07-09 16:40:37 -070078 BOOST_CHECK_NO_THROW(SignatureSha256WithEcdsa(sig));
79 BOOST_CHECK_NO_THROW(sig.getKeyLocator());
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070080}
81
82BOOST_AUTO_TEST_CASE(Encoding)
83{
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070084 Name name("/test/key/locator");
85 KeyLocator keyLocator(name);
86
Yingdi Yu4a557052014-07-09 16:40:37 -070087 SignatureSha256WithEcdsa sig(keyLocator);
88
89 BOOST_CHECK_NO_THROW(sig.getKeyLocator());
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070090
91 const Block& encodeSigInfoBlock = sig.getInfo();
92
93 Block sigInfoBlock(sigInfo, sizeof(sigInfo));
94
95 BOOST_CHECK_EQUAL_COLLECTIONS(sigInfoBlock.wire(),
96 sigInfoBlock.wire() + sigInfoBlock.size(),
97 encodeSigInfoBlock.wire(),
98 encodeSigInfoBlock.wire() + encodeSigInfoBlock.size());
Alexander Afanasyev1c6976d2014-07-13 11:40:50 -070099
100 sig.setKeyLocator(Name("/test/another/key/locator"));
101
102 const Block& encodeSigInfoBlock2 = sig.getInfo();
103 BOOST_CHECK(sigInfoBlock != encodeSigInfoBlock2);
Yingdi Yuebfa4cb2014-06-17 15:28:53 -0700104}
105
Yingdi Yu6ab67812014-11-27 15:00:34 -0800106BOOST_AUTO_TEST_CASE(DataSignature)
107{
108 Name identityName("/SecurityTestSignatureSha256WithEcdsa/DataSignature");
109 BOOST_REQUIRE(addIdentity(identityName, EcdsaKeyParams()));
Alexander Afanasyev2fa59392016-07-29 17:24:23 -0700110 shared_ptr<security::v1::PublicKey> publicKey;
Yingdi Yu6ab67812014-11-27 15:00:34 -0800111 BOOST_REQUIRE_NO_THROW(publicKey = m_keyChain.getPublicKeyFromTpm(
112 m_keyChain.getDefaultKeyNameForIdentity(identityName)));
113
114 Data testData("/SecurityTestSignatureSha256WithEcdsa/DataSignature/Data1");
115 char content[5] = "1234";
116 testData.setContent(reinterpret_cast<uint8_t*>(content), 5);
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700117 BOOST_CHECK_NO_THROW(m_keyChain.sign(testData,
118 security::SigningInfo(security::SigningInfo::SIGNER_TYPE_ID,
119 identityName)));
Yingdi Yu6ab67812014-11-27 15:00:34 -0800120 Block dataBlock(testData.wireEncode().wire(), testData.wireEncode().size());
121
122 Data testData2;
123 testData2.wireDecode(dataBlock);
124 BOOST_CHECK(Validator::verifySignature(testData2, *publicKey));
125}
126
Yingdi Yu6ab67812014-11-27 15:00:34 -0800127BOOST_AUTO_TEST_CASE(InterestSignature)
128{
129 Name identityName("/SecurityTestSignatureSha256WithEcdsa/InterestSignature");
130 BOOST_REQUIRE(addIdentity(identityName, EcdsaKeyParams()));
Alexander Afanasyev2fa59392016-07-29 17:24:23 -0700131 shared_ptr<security::v1::PublicKey> publicKey;
Yingdi Yu6ab67812014-11-27 15:00:34 -0800132 BOOST_REQUIRE_NO_THROW(publicKey = m_keyChain.getPublicKeyFromTpm(
133 m_keyChain.getDefaultKeyNameForIdentity(identityName)));
134
135
136 Interest interest("/SecurityTestSignatureSha256WithEcdsa/InterestSignature/Interest1");
137 Interest interest11("/SecurityTestSignatureSha256WithEcdsa/InterestSignature/Interest1");
138
139 scheduler.scheduleEvent(time::milliseconds(100), [&] {
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700140 BOOST_CHECK_NO_THROW(m_keyChain.sign(interest,
141 security::SigningInfo(security::SigningInfo::SIGNER_TYPE_ID,
142 identityName)));
Yingdi Yu6ab67812014-11-27 15:00:34 -0800143 });
144
145 advanceClocks(time::milliseconds(100));
146 scheduler.scheduleEvent(time::milliseconds(100), [&] {
Yingdi Yu1b0311c2015-06-10 14:58:47 -0700147 BOOST_CHECK_NO_THROW(m_keyChain.sign(interest11,
148 security::SigningInfo(security::SigningInfo::SIGNER_TYPE_ID,
149 identityName)));
Yingdi Yu6ab67812014-11-27 15:00:34 -0800150 });
151
152 advanceClocks(time::milliseconds(100));
153
154 time::system_clock::TimePoint timestamp1 =
155 time::fromUnixTimestamp(
156 time::milliseconds(interest.getName().get(signed_interest::POS_TIMESTAMP).toNumber()));
157
158 time::system_clock::TimePoint timestamp2 =
159 time::fromUnixTimestamp(
160 time::milliseconds(interest11.getName().get(signed_interest::POS_TIMESTAMP).toNumber()));
161
162 BOOST_CHECK_EQUAL(time::milliseconds(100), (timestamp2 - timestamp1));
163
164 uint64_t nonce1 = interest.getName().get(signed_interest::POS_RANDOM_VAL).toNumber();
165 uint64_t nonce2 = interest11.getName().get(signed_interest::POS_RANDOM_VAL).toNumber();
166 BOOST_WARN_NE(nonce1, nonce2);
167
168 Block interestBlock(interest.wireEncode().wire(), interest.wireEncode().size());
169
170 Interest interest2;
171 interest2.wireDecode(interestBlock);
172 BOOST_CHECK(Validator::verifySignature(interest2, *publicKey));
173}
174
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100175BOOST_AUTO_TEST_SUITE_END() // TestSignatureSha256WithEcdsa
176BOOST_AUTO_TEST_SUITE_END() // Security
Yingdi Yuebfa4cb2014-06-17 15:28:53 -0700177
Yingdi Yu6ab67812014-11-27 15:00:34 -0800178} // namespace tests
Yingdi Yuebfa4cb2014-06-17 15:28:53 -0700179} // namespace ndn