blob: d52d923fe34e9e1851846bc1f081c096e473115e [file] [log] [blame]
Yingdi Yuebfa4cb2014-06-17 15:28:53 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento0f830802018-01-16 23:58:58 -05002/*
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -05003 * Copyright (c) 2013-2020 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
Davide Pesavento7e780642018-11-24 15:51:34 -050022#include "ndn-cxx/security/signature-sha256-with-rsa.hpp"
23#include "ndn-cxx/security/verification-helpers.hpp"
24#include "ndn-cxx/util/scheduler.hpp"
Davide Pesaventoeee3e822016-11-26 19:19:34 +010025
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -050026#include "tests/test-common.hpp"
27#include "tests/unit/io-key-chain-fixture.hpp"
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070028
29namespace ndn {
Alexander Afanasyev70244f42017-01-04 12:47:12 -080030namespace security {
Yingdi Yu6ab67812014-11-27 15:00:34 -080031namespace tests {
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070032
Alexander Afanasyev70244f42017-01-04 12:47:12 -080033using namespace ndn::tests;
34
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -050035class SignatureSha256RsaTimeFixture : public IoKeyChainFixture
Yingdi Yu6ab67812014-11-27 15:00:34 -080036{
37public:
38 SignatureSha256RsaTimeFixture()
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -050039 : scheduler(m_io)
Yingdi Yu6ab67812014-11-27 15:00:34 -080040 {
41 }
42
43public:
44 Scheduler scheduler;
45};
46
Davide Pesaventoeee3e822016-11-26 19:19:34 +010047BOOST_AUTO_TEST_SUITE(Security)
48BOOST_FIXTURE_TEST_SUITE(TestSignatureSha256WithRsa, SignatureSha256RsaTimeFixture)
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070049
50const uint8_t sigInfo[] = {
Alexander Afanasyev70244f42017-01-04 12:47:12 -080051 0x16, 0x1b, // SignatureInfo
52 0x1b, 0x01, // SignatureType
53 0x01,
54 0x1c, 0x16, // KeyLocator
55 0x07, 0x14, // Name
56 0x08, 0x04,
57 0x74, 0x65, 0x73, 0x74,
58 0x08, 0x03,
59 0x6b, 0x65, 0x79,
60 0x08, 0x07,
61 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070062};
63
64const uint8_t sigValue[] = {
650x17, 0x80, // SignatureValue
66 0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
67 0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
68 0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
69 0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
70 0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
71 0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
72 0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
73 0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
74 0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
75 0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
76};
77
78
79BOOST_AUTO_TEST_CASE(Decoding)
80{
81 Block sigInfoBlock(sigInfo, sizeof(sigInfo));
82 Block sigValueBlock(sigValue, sizeof(sigValue));
83
84 Signature sig(sigInfoBlock, sigValueBlock);
Davide Pesavento8a8c01b2018-03-11 00:07:52 -050085 BOOST_CHECK_NO_THROW(SignatureSha256WithRsa{sig});
Yingdi Yu4a557052014-07-09 16:40:37 -070086 BOOST_CHECK_NO_THROW(sig.getKeyLocator());
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070087}
88
89BOOST_AUTO_TEST_CASE(Encoding)
90{
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070091 Name name("/test/key/locator");
92 KeyLocator keyLocator(name);
93
Yingdi Yu4a557052014-07-09 16:40:37 -070094 SignatureSha256WithRsa sig(keyLocator);
95
96 BOOST_CHECK_NO_THROW(sig.getKeyLocator());
Yingdi Yuebfa4cb2014-06-17 15:28:53 -070097
98 const Block& encodeSigInfoBlock = sig.getInfo();
99
100 Block sigInfoBlock(sigInfo, sizeof(sigInfo));
101
102 BOOST_CHECK_EQUAL_COLLECTIONS(sigInfoBlock.wire(),
103 sigInfoBlock.wire() + sigInfoBlock.size(),
104 encodeSigInfoBlock.wire(),
105 encodeSigInfoBlock.wire() + encodeSigInfoBlock.size());
Alexander Afanasyev1c6976d2014-07-13 11:40:50 -0700106
107 sig.setKeyLocator(Name("/test/another/key/locator"));
108
109 const Block& encodeSigInfoBlock2 = sig.getInfo();
Junxiao Shi72c0c642018-04-20 15:41:09 +0000110 BOOST_CHECK_NE(sigInfoBlock, encodeSigInfoBlock2);
Yingdi Yuebfa4cb2014-06-17 15:28:53 -0700111}
112
Yingdi Yu6ab67812014-11-27 15:00:34 -0800113BOOST_AUTO_TEST_CASE(DataSignature)
114{
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -0500115 Identity identity = m_keyChain.createIdentity("/SecurityTestSignatureSha256WithRsa/DataSignature", RsaKeyParams());
Yingdi Yu6ab67812014-11-27 15:00:34 -0800116
117 Data testData("/SecurityTestSignatureSha256WithRsa/DataSignature/Data1");
118 char content[5] = "1234";
119 testData.setContent(reinterpret_cast<uint8_t*>(content), 5);
Alexander Afanasyev70244f42017-01-04 12:47:12 -0800120 BOOST_CHECK_NO_THROW(m_keyChain.sign(testData, security::SigningInfo(identity)));
Yingdi Yu6ab67812014-11-27 15:00:34 -0800121 Block dataBlock(testData.wireEncode().wire(), testData.wireEncode().size());
122
123 Data testData2;
124 testData2.wireDecode(dataBlock);
Alexander Afanasyev574aa862017-01-10 19:53:28 -0800125 BOOST_CHECK(verifySignature(testData2, identity.getDefaultKey()));
Yingdi Yu6ab67812014-11-27 15:00:34 -0800126}
127
128BOOST_AUTO_TEST_CASE(InterestSignature)
129{
Davide Pesavento4c1ad4c2020-11-16 21:12:02 -0500130 Identity identity = m_keyChain.createIdentity("/SecurityTestSignatureSha256WithRsa/InterestSignature", RsaKeyParams());
Yingdi Yu6ab67812014-11-27 15:00:34 -0800131
Junxiao Shib55e5d32018-07-18 13:32:00 -0600132 auto interest = makeInterest("/SecurityTestSignatureSha256WithRsa/InterestSignature/Interest1");
133 auto interest11 = makeInterest("/SecurityTestSignatureSha256WithRsa/InterestSignature/Interest1");
Yingdi Yu6ab67812014-11-27 15:00:34 -0800134
Junxiao Shia5f233e2019-03-18 09:39:22 -0600135 scheduler.schedule(100_ms, [&] { m_keyChain.sign(*interest, security::SigningInfo(identity)); });
Davide Pesavento0f830802018-01-16 23:58:58 -0500136 advanceClocks(100_ms);
Junxiao Shia5f233e2019-03-18 09:39:22 -0600137 scheduler.schedule(100_ms, [&] { m_keyChain.sign(*interest11, security::SigningInfo(identity)); });
Davide Pesavento0f830802018-01-16 23:58:58 -0500138 advanceClocks(100_ms);
Yingdi Yu6ab67812014-11-27 15:00:34 -0800139
Junxiao Shib55e5d32018-07-18 13:32:00 -0600140 Block interestBlock(interest->wireEncode().wire(), interest->wireEncode().size());
Yingdi Yu6ab67812014-11-27 15:00:34 -0800141
142 Interest interest2;
143 interest2.wireDecode(interestBlock);
Alexander Afanasyev574aa862017-01-10 19:53:28 -0800144 BOOST_CHECK(verifySignature(interest2, identity.getDefaultKey()));
Yingdi Yu6ab67812014-11-27 15:00:34 -0800145}
146
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100147BOOST_AUTO_TEST_SUITE_END() // TestSignatureSha256WithRsa
148BOOST_AUTO_TEST_SUITE_END() // Security
Yingdi Yuebfa4cb2014-06-17 15:28:53 -0700149
Yingdi Yu6ab67812014-11-27 15:00:34 -0800150} // namespace tests
Alexander Afanasyev70244f42017-01-04 12:47:12 -0800151} // namespace security
Yingdi Yuebfa4cb2014-06-17 15:28:53 -0700152} // namespace ndn