blob: 55eaa10c1d053a80ebbbb68724fa38b0f8c56193 [file] [log] [blame]
Yingdi Yude222c72014-08-15 16:06:52 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento94368312017-07-08 22:25:03 -04002/*
Davide Pesavento334516a2024-02-09 18:02:36 -05003 * Copyright (c) 2013-2024 Regents of the University of California.
Yingdi Yude222c72014-08-15 16:06:52 -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/util/sha256.hpp"
23#include "ndn-cxx/util/string-helper.hpp"
Yingdi Yude222c72014-08-15 16:06:52 -070024
Davide Pesavento7e780642018-11-24 15:51:34 -050025#include "tests/boost-test.hpp"
Yingdi Yude222c72014-08-15 16:06:52 -070026
Davide Pesavento14883ad2018-07-14 16:31:39 -040027#include <boost/endian/conversion.hpp>
Davide Pesavento334516a2024-02-09 18:02:36 -050028
29#include <array>
Davide Pesaventoa84f4642017-08-23 16:14:51 -040030#include <sstream>
31
Davide Pesavento47ce2ee2023-05-09 01:33:33 -040032namespace ndn::tests {
33
34using ndn::util::Sha256;
Yingdi Yude222c72014-08-15 16:06:52 -070035
Davide Pesaventoeee3e822016-11-26 19:19:34 +010036BOOST_AUTO_TEST_SUITE(Util)
Davide Pesavento94368312017-07-08 22:25:03 -040037BOOST_AUTO_TEST_SUITE(TestSha256)
Yingdi Yude222c72014-08-15 16:06:52 -070038
Davide Pesavento94368312017-07-08 22:25:03 -040039BOOST_AUTO_TEST_CASE(Basic)
Yingdi Yude222c72014-08-15 16:06:52 -070040{
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -050041 const uint8_t buf[] = {0x01, 0x02, 0x03, 0x04};
42 auto input = make_span(buf);
Davide Pesavento10b24be2017-07-12 23:23:46 -040043 auto expected = fromHex("9f64a747e1b97f131fabb6b447296c9b6f0201e79fb3c5356e6c77e89b6a806a");
Yingdi Yude222c72014-08-15 16:06:52 -070044
45 Sha256 statefulSha256;
Davide Pesavento94368312017-07-08 22:25:03 -040046 BOOST_CHECK_EQUAL(statefulSha256.empty(), true);
47
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -050048 statefulSha256.update(input.subspan(0, 1));
49 statefulSha256.update(input.subspan(1, 1));
50 statefulSha256.update(input.subspan(2, 1));
51 statefulSha256.update(input.subspan(3, 1));
Davide Pesavento10b24be2017-07-12 23:23:46 -040052 ConstBufferPtr digest = statefulSha256.computeDigest();
53 BOOST_CHECK_EQUAL(digest->size(), Sha256::DIGEST_SIZE);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -050054 BOOST_TEST(*digest == *expected, boost::test_tools::per_element());
Alexander Afanasyevd27334f2015-07-01 21:44:36 -070055}
56
57BOOST_AUTO_TEST_CASE(ConstructFromStream)
58{
Davide Pesavento10b24be2017-07-12 23:23:46 -040059 const std::string input = "Hello, world!";
60 auto expected = fromHex("315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3");
Alexander Afanasyevd27334f2015-07-01 21:44:36 -070061
62 std::istringstream is(input);
Davide Pesavento94368312017-07-08 22:25:03 -040063 Sha256 sha(is);
64 BOOST_CHECK_EQUAL(sha.empty(), false);
Davide Pesavento10b24be2017-07-12 23:23:46 -040065 BOOST_CHECK_EQUAL(sha.toString(), "315F5BDB76D078C43B8AC0064E4A0164612B1FCE77C869345BFC94C75894EDD3");
Davide Pesavento94368312017-07-08 22:25:03 -040066
Davide Pesavento10b24be2017-07-12 23:23:46 -040067 ConstBufferPtr digest = sha.computeDigest();
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -050068 BOOST_TEST(*digest == *expected, boost::test_tools::per_element());
Alexander Afanasyevd27334f2015-07-01 21:44:36 -070069}
70
Yingdi Yude222c72014-08-15 16:06:52 -070071BOOST_AUTO_TEST_CASE(Compare)
72{
Davide Pesavento94368312017-07-08 22:25:03 -040073 const uint8_t origin[] = {0x01, 0x02, 0x03, 0x04};
Yingdi Yude222c72014-08-15 16:06:52 -070074
Davide Pesavento10b24be2017-07-12 23:23:46 -040075 Sha256 digest1;
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -050076 digest1.update(origin);
Davide Pesavento10b24be2017-07-12 23:23:46 -040077 digest1.computeDigest();
Yingdi Yude222c72014-08-15 16:06:52 -070078
79 Sha256 digest2;
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -050080 auto in = make_span(origin);
81 digest2.update(in.first(2));
82 digest2.update(in.last(2));
Yingdi Yude222c72014-08-15 16:06:52 -070083 digest2.computeDigest();
84
Davide Pesavento10b24be2017-07-12 23:23:46 -040085 BOOST_CHECK_EQUAL(digest1 == digest2, true);
86 BOOST_CHECK_EQUAL(digest1 != digest2, false);
Yingdi Yude222c72014-08-15 16:06:52 -070087}
88
Davide Pesavento94368312017-07-08 22:25:03 -040089BOOST_AUTO_TEST_CASE(InsertionOperatorSha256)
Yingdi Yude222c72014-08-15 16:06:52 -070090{
Davide Pesavento10b24be2017-07-12 23:23:46 -040091 auto expected = fromHex("d7bd34bfe44a18d2aa755a344fe3e6b06ed0473772e6dfce16ac71ba0b0a241c");
Yingdi Yude222c72014-08-15 16:06:52 -070092
Davide Pesavento94368312017-07-08 22:25:03 -040093 Sha256 innerDigest;
94 innerDigest << "TEST";
Yingdi Yude222c72014-08-15 16:06:52 -070095
96 Sha256 statefulSha256;
Davide Pesavento94368312017-07-08 22:25:03 -040097 statefulSha256 << innerDigest;
Davide Pesavento10b24be2017-07-12 23:23:46 -040098 ConstBufferPtr digest = statefulSha256.computeDigest();
Yingdi Yude222c72014-08-15 16:06:52 -070099
Davide Pesavento10b24be2017-07-12 23:23:46 -0400100 BOOST_CHECK_EQUAL(statefulSha256.empty(), false);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500101 BOOST_TEST(*digest == *expected, boost::test_tools::per_element());
Yingdi Yude222c72014-08-15 16:06:52 -0700102}
103
Davide Pesavento94368312017-07-08 22:25:03 -0400104BOOST_AUTO_TEST_CASE(InsertionOperatorString)
Yingdi Yude222c72014-08-15 16:06:52 -0700105{
Davide Pesavento10b24be2017-07-12 23:23:46 -0400106 const std::string input = "Hello, world!";
107 auto expected = fromHex("315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3");
Yingdi Yude222c72014-08-15 16:06:52 -0700108
Yingdi Yude222c72014-08-15 16:06:52 -0700109 Sha256 statefulSha256;
Davide Pesavento10b24be2017-07-12 23:23:46 -0400110 statefulSha256 << input;
111 ConstBufferPtr digest = statefulSha256.computeDigest();
Yingdi Yude222c72014-08-15 16:06:52 -0700112
Davide Pesavento10b24be2017-07-12 23:23:46 -0400113 BOOST_CHECK_EQUAL(statefulSha256.empty(), false);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500114 BOOST_TEST(*digest == *expected, boost::test_tools::per_element());
Yingdi Yude222c72014-08-15 16:06:52 -0700115}
116
Davide Pesavento258d51a2022-02-27 21:26:28 -0500117BOOST_AUTO_TEST_CASE(InsertionOperatorUnsignedInt)
118{
Davide Pesavento334516a2024-02-09 18:02:36 -0500119 const std::array input{1, 2, 3, 4};
Davide Pesavento258d51a2022-02-27 21:26:28 -0500120 auto expected = fromHex("7236c00c170036c6de133a878210ddd58567aa1d0619a0f70f69e38ae6f916e9");
121
122 Sha256 statefulSha256;
Davide Pesavento334516a2024-02-09 18:02:36 -0500123 for (auto i : input) {
124 statefulSha256 << boost::endian::native_to_big(static_cast<uint64_t>(i));
Davide Pesavento258d51a2022-02-27 21:26:28 -0500125 }
126 ConstBufferPtr digest = statefulSha256.computeDigest();
127
128 BOOST_CHECK_EQUAL(statefulSha256.empty(), false);
129 BOOST_TEST(*digest == *expected, boost::test_tools::per_element());
130}
131
132BOOST_AUTO_TEST_CASE(InsertionOperatorSpan)
Yingdi Yude222c72014-08-15 16:06:52 -0700133{
Davide Pesavento10b24be2017-07-12 23:23:46 -0400134 const uint8_t input[] = {
Yingdi Yude222c72014-08-15 16:06:52 -0700135 0x16, 0x1b, // SignatureInfo
136 0x1b, 0x01, // SignatureType
137 0x01, // Sha256WithRsa
138 0x1c, 0x16, // KeyLocator
139 0x07, 0x14, // Name
140 0x08, 0x04,
141 0x74, 0x65, 0x73, 0x74,
142 0x08, 0x03,
143 0x6b, 0x65, 0x79,
144 0x08, 0x07,
145 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72
146 };
Davide Pesavento10b24be2017-07-12 23:23:46 -0400147 auto expected = fromHex("b372edfd4d6a4db2cfeaeead6c34fdee9b9e759f7b8d799cf8067e39e7f2886c");
Yingdi Yude222c72014-08-15 16:06:52 -0700148
149 Sha256 statefulSha256;
Davide Pesavento258d51a2022-02-27 21:26:28 -0500150 statefulSha256 << input;
Davide Pesavento10b24be2017-07-12 23:23:46 -0400151 ConstBufferPtr digest = statefulSha256.computeDigest();
Yingdi Yude222c72014-08-15 16:06:52 -0700152
Davide Pesavento10b24be2017-07-12 23:23:46 -0400153 BOOST_CHECK_EQUAL(statefulSha256.empty(), false);
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500154 BOOST_TEST(*digest == *expected, boost::test_tools::per_element());
Davide Pesavento94368312017-07-08 22:25:03 -0400155}
156
157BOOST_AUTO_TEST_CASE(Reset)
158{
159 Sha256 sha;
160 BOOST_CHECK_EQUAL(sha.empty(), true);
161
162 sha << 42;
163 BOOST_CHECK_EQUAL(sha.empty(), false);
164
165 sha.computeDigest(); // finalize
166 sha.reset();
167 BOOST_CHECK_EQUAL(sha.empty(), true);
168 BOOST_CHECK_NO_THROW(sha << 42);
Yingdi Yude222c72014-08-15 16:06:52 -0700169}
170
Davide Pesavento94368312017-07-08 22:25:03 -0400171BOOST_AUTO_TEST_CASE(StaticComputeDigest)
Yingdi Yude222c72014-08-15 16:06:52 -0700172{
Davide Pesavento10b24be2017-07-12 23:23:46 -0400173 auto expected = fromHex("9f64a747e1b97f131fabb6b447296c9b6f0201e79fb3c5356e6c77e89b6a806a");
174
Davide Pesaventodf8fd8a2022-02-21 20:04:21 -0500175 ConstBufferPtr digest = Sha256::computeDigest({0x01, 0x02, 0x03, 0x04});
176 BOOST_TEST(*digest == *expected, boost::test_tools::per_element());
Yingdi Yude222c72014-08-15 16:06:52 -0700177}
178
Davide Pesavento258d51a2022-02-27 21:26:28 -0500179BOOST_AUTO_TEST_CASE(Error)
180{
181 Sha256 sha;
182 sha << 42;
183 sha.computeDigest(); // finalize
184 BOOST_CHECK_THROW(sha << 42, Sha256::Error);
185}
186
Yingdi Yu9ad2d722014-08-30 16:13:57 -0700187BOOST_AUTO_TEST_CASE(Print)
188{
Davide Pesavento94368312017-07-08 22:25:03 -0400189 const uint8_t origin[] = {0x94, 0xEE, 0x05, 0x93, 0x35, 0xE5, 0x87, 0xE5,
190 0x01, 0xCC, 0x4B, 0xF9, 0x06, 0x13, 0xE0, 0x81,
191 0x4F, 0x00, 0xA7, 0xB0, 0x8B, 0xC7, 0xC6, 0x48,
192 0xFD, 0x86, 0x5A, 0x2A, 0xF6, 0xA2, 0x2C, 0xC2};
Davide Pesavento35c63792022-01-17 02:06:03 -0500193 const auto expected = toHex(origin);
Yingdi Yu9ad2d722014-08-30 16:13:57 -0700194
Yingdi Yu9ad2d722014-08-30 16:13:57 -0700195 Sha256 digest;
Davide Pesavento94368312017-07-08 22:25:03 -0400196 digest << "TEST";
Yingdi Yu9ad2d722014-08-30 16:13:57 -0700197 std::ostringstream os;
198 os << digest;
Davide Pesavento10b24be2017-07-12 23:23:46 -0400199 BOOST_CHECK_EQUAL(os.str(), expected);
200 BOOST_CHECK_EQUAL(digest.toString(), expected);
Yingdi Yu9ad2d722014-08-30 16:13:57 -0700201}
202
Davide Pesavento94368312017-07-08 22:25:03 -0400203BOOST_AUTO_TEST_SUITE_END() // TestSha256
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100204BOOST_AUTO_TEST_SUITE_END() // Util
Yingdi Yude222c72014-08-15 16:06:52 -0700205
Davide Pesavento47ce2ee2023-05-09 01:33:33 -0400206} // namespace ndn::tests