From 79913e675965464cff64509e702d7bc39bf60acb Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Thu, 5 May 2016 12:23:07 -0400 Subject: [PATCH] Fix SHA1 calculation --- include/beast/detail/sha1.hpp | 13 +++--- test/CMakeLists.txt | 1 + test/Jamfile | 1 + test/detail/base64.cpp | 34 +++++---------- test/detail/empty_base_optimization.cpp | 37 +++++----------- test/detail/sha1.cpp | 56 +++++++++++++++++++++++++ 6 files changed, 85 insertions(+), 57 deletions(-) create mode 100644 test/detail/sha1.cpp diff --git a/include/beast/detail/sha1.hpp b/include/beast/detail/sha1.hpp index c34b1bb8..a868568f 100644 --- a/include/beast/detail/sha1.hpp +++ b/include/beast/detail/sha1.hpp @@ -218,13 +218,13 @@ transform( struct sha1_context { - static unsigned int const block_size = sha1::BLOCK_BYTES; - static unsigned int const digest_size = 20; + static unsigned int constexpr block_size = sha1::BLOCK_BYTES; + static unsigned int constexpr digest_size = 20; - std::uint32_t digest[5]; - std::uint8_t buf[block_size]; std::size_t buflen; std::size_t blocks; + std::uint32_t digest[5]; + std::uint8_t buf[block_size]; }; template @@ -232,12 +232,12 @@ void init(sha1_context& ctx) noexcept { ctx.buflen = 0; + ctx.blocks = 0; ctx.digest[0] = 0x67452301; ctx.digest[1] = 0xefcdab89; ctx.digest[2] = 0x98badcfe; ctx.digest[3] = 0x10325476; ctx.digest[4] = 0xc3d2e1f0; - ctx.blocks = 0; } template @@ -275,15 +275,14 @@ finish(sha1_context& ctx, void* digest) noexcept std::uint64_t total_bits = (ctx.blocks*64 + ctx.buflen) * 8; // pad - auto const buflen = ctx.buflen; ctx.buf[ctx.buflen++] = 0x80; + auto const buflen = ctx.buflen; while(ctx.buflen < 64) ctx.buf[ctx.buflen++] = 0x00; std::uint32_t block[BLOCK_INTS]; sha1::make_block(ctx.buf, block); if (buflen > BLOCK_BYTES - 8) { - ++ctx.blocks; sha1::transform(ctx.digest, block); for (size_t i = 0; i < BLOCK_INTS - 2; i++) block[i] = 0; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 84d6df20..e384dcdf 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -29,6 +29,7 @@ add_executable (core-tests write_streambuf.cpp detail/base64.cpp detail/empty_base_optimization.cpp + detail/sha1.cpp ) if (NOT WIN32) diff --git a/test/Jamfile b/test/Jamfile index 9cc87f2f..218c3f5d 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -32,6 +32,7 @@ unit-test core-tests : write_streambuf.cpp detail/base64.cpp detail/empty_base_optimization.cpp + detail/sha1.cpp ; unit-test http-tests : diff --git a/test/detail/base64.cpp b/test/detail/base64.cpp index 6180aeb2..2667ce25 100644 --- a/test/detail/base64.cpp +++ b/test/detail/base64.cpp @@ -1,37 +1,25 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== +// +// Copyright (c) 2013-2016 Vinnie Falco (vinnie dot falco at gmail dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// #include #include namespace beast { -namespace test { +namespace detail { -class base64_test : public detail::unit_test::suite +class base64_test : public beast::detail::unit_test::suite { public: void check (std::string const& in, std::string const& out) { - auto const encoded = detail::base64_encode (in); + auto const encoded = base64_encode (in); expect (encoded == out); - expect (detail::base64_decode (encoded) == in); + expect (base64_decode (encoded) == in); } void @@ -49,6 +37,6 @@ public: BEAST_DEFINE_TESTSUITE(base64,core,beast); -} // test +} // detail } // beast diff --git a/test/detail/empty_base_optimization.cpp b/test/detail/empty_base_optimization.cpp index cd29072d..3fbeaa76 100644 --- a/test/detail/empty_base_optimization.cpp +++ b/test/detail/empty_base_optimization.cpp @@ -1,32 +1,15 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2014, Howard Hinnant - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -#if BEAST_INCLUDE_BEASTCONFIG -#include -#endif +// +// Copyright (c) 2013-2016 Vinnie Falco (vinnie dot falco at gmail dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// #include - #include namespace beast { -namespace test { +namespace detail { class empty_base_optimization_test : public beast::detail::unit_test::suite @@ -34,9 +17,9 @@ class empty_base_optimization_test public: template class test1 - : private detail::empty_base_optimization + : private empty_base_optimization { - using Base = detail::empty_base_optimization; + using Base = empty_base_optimization; void* m_p; public: explicit test1 (T const& t) @@ -105,5 +88,5 @@ public: BEAST_DEFINE_TESTSUITE(empty_base_optimization,core,beast); -} // test +} // detail } // beast diff --git a/test/detail/sha1.cpp b/test/detail/sha1.cpp new file mode 100644 index 00000000..154f2f35 --- /dev/null +++ b/test/detail/sha1.cpp @@ -0,0 +1,56 @@ +// +// Copyright (c) 2013-2016 Vinnie Falco (vinnie dot falco at gmail dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#include +#include +#include +#include + +namespace beast { +namespace detail { + +class sha1_test : public beast::detail::unit_test::suite +{ +public: + void + check(std::string const& message, std::string const& answer) + { + using digest_type = + std::array; + digest_type digest; + if(! expect(boost::algorithm::unhex( + answer, digest.begin()) == digest.end())) + return; + sha1_context ctx; + digest_type result; + init(ctx); + update(ctx, message.data(), message.size()); + finish(ctx, result.data()); + expect(result == digest); + } + + void + run() + { + // http://www.di-mgt.com.au/sha_testvectors.html + // + check("abc", + "a9993e36" "4706816a" "ba3e2571" "7850c26c" "9cd0d89d"); + check("", + "da39a3ee" "5e6b4b0d" "3255bfef" "95601890" "afd80709"); + check("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "84983e44" "1c3bd26e" "baae4aa1" "f95129e5" "e54670f1"); + check("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu", + "a49b2446" "a02c645b" "f419f995" "b6709125" "3a04a259"); + } +}; + +BEAST_DEFINE_TESTSUITE(sha1,core,beast); + +} // test +} // beast +