2
0
mirror of https://github.com/boostorg/hash2.git synced 2026-01-19 16:22:15 +00:00
Files
hash2/test/ripemd_cx.cpp
Christian Mazakas bf71ac7f16 add gcc-5 workaround
2024-11-12 14:52:55 -08:00

99 lines
5.1 KiB
C++

// Copyright 2024 Christian Mazakas
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#include <boost/hash2/ripemd.hpp>
#include <boost/hash2/digest.hpp>
#include <boost/hash2/hash_append.hpp>
#include <boost/hash2/detail/config.hpp>
#include <boost/core/lightweight_test.hpp>
#include <boost/config.hpp>
#if defined(BOOST_MSVC) && BOOST_MSVC < 1920
# pragma warning(disable: 4307) // integral constant overflow
#endif
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
#if defined(BOOST_NO_CXX14_CONSTEXPR)
# define TEST_EQ(x1, x2) BOOST_TEST_EQ(x1, x2)
#else
# define TEST_EQ(x1, x2) BOOST_TEST_EQ(x1, x2); STATIC_ASSERT(x1 == x2)
#endif
template<class H, std::size_t N> BOOST_CXX14_CONSTEXPR typename H::result_type test( std::uint64_t seed, char const (&str)[ N ] )
{
H h( seed );
std::size_t const M = N - 1; // strip off null-terminator
#if BOOST_WORKAROUND(BOOST_GCC, >= 50000 && BOOST_GCC < 60000)
unsigned char buf[M] = {};
for( unsigned i = 0; i < M; ++i ) buf[ i ] = str[ i ];
h.update( buf, M / 3 );
h.update( buf + M / 3, M - M / 3 );
#else
boost::hash2::hash_append_range( h, boost::hash2::default_flavor{}, str, str + M / 3 );
boost::hash2::hash_append_range( h, boost::hash2::default_flavor{}, str + M / 3, str + M );
#endif
return h.result();
}
BOOST_CXX14_CONSTEXPR unsigned char to_byte( char c )
{
if (c >= '0' && c <= '9') return c - '0';
if (c >= 'a' && c <= 'f') return c - 'a' + 10;
if (c >= 'A' && c <= 'F') return c - 'A' + 10;
return 0xff;
}
template<std::size_t N, std::size_t M = ( N - 1 ) / 2>
BOOST_CXX14_CONSTEXPR boost::hash2::digest<M> digest_from_hex( char const (&str)[ N ] )
{
boost::hash2::digest<M> dgst = {};
auto* p = dgst.data();
for( unsigned i = 0; i < M; ++i ) {
auto c1 = to_byte( str[ 2 * i ] );
auto c2 = to_byte( str[ 2 * i + 1 ] );
p[ i ] = ( c1 << 4 ) | c2;
}
return dgst;
}
int main()
{
using namespace boost::hash2;
TEST_EQ( digest_from_hex( "0bdc9d2d256b3ee9daae347be6f4dc835a467ffe" ), test<ripemd_160>( 0, "a" ) );
TEST_EQ( digest_from_hex( "8eb208f7e05d987a9b044a8e98c6b087f15a0bfc" ), test<ripemd_160>( 0, "abc" ) );
TEST_EQ( digest_from_hex( "5d0689ef49d2fae572b881b123a85ffa21595f36" ), test<ripemd_160>( 0, "message digest" ) );
TEST_EQ( digest_from_hex( "f71c27109c692c1b56bbdceb5b9d2865b3708dbc" ), test<ripemd_160>( 0, "abcdefghijklmnopqrstuvwxyz" ) );
TEST_EQ( digest_from_hex( "12a053384a9c0c88e405a06c27dcf49ada62eb2b" ), test<ripemd_160>( 0, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" ) );
TEST_EQ( digest_from_hex( "b0e20b6e3116640286ed3a87a5713079b21f5189" ), test<ripemd_160>( 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" ) );
TEST_EQ( digest_from_hex( "7580d81d5ed1467317ce3ab9199088764a518b9d" ), test<ripemd_160>( 7, "a" ) );
TEST_EQ( digest_from_hex( "f5a724fe56b405db4edcb1ea46707ad78753a2e4" ), test<ripemd_160>( 7, "abc" ) );
TEST_EQ( digest_from_hex( "da6a32ce82c07de14ac5c2be1be3775201f07941" ), test<ripemd_160>( 7, "message digest" ) );
TEST_EQ( digest_from_hex( "221e3b3af0671febf816397ded6f05c8a5c540d3" ), test<ripemd_160>( 7, "abcdefghijklmnopqrstuvwxyz" ) );
TEST_EQ( digest_from_hex( "4578ce76d4ddec5a75288306da83f65eb963973c" ), test<ripemd_160>( 7, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" ) );
TEST_EQ( digest_from_hex( "868f80dffc5c55612afdd5f8c7c4948410134dc5" ), test<ripemd_160>( 7, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" ) );
TEST_EQ( digest_from_hex( "86be7afa339d0fc7cfc785e72f578d33" ), test<ripemd_128>( 0, "a" ) );
TEST_EQ( digest_from_hex( "c14a12199c66e4ba84636b0f69144c77" ), test<ripemd_128>( 0, "abc" ) );
TEST_EQ( digest_from_hex( "9e327b3d6e523062afc1132d7df9d1b8" ), test<ripemd_128>( 0, "message digest" ) );
TEST_EQ( digest_from_hex( "fd2aa607f71dc8f510714922b371834e" ), test<ripemd_128>( 0, "abcdefghijklmnopqrstuvwxyz" ) );
TEST_EQ( digest_from_hex( "a1aa0689d0fafa2ddc22e88b49133a06" ), test<ripemd_128>( 0, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" ) );
TEST_EQ( digest_from_hex( "d1e959eb179c911faea4624c60c5c702" ), test<ripemd_128>( 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" ) );
TEST_EQ( digest_from_hex( "f27337949d37e6be3d72a8426fa294e4" ), test<ripemd_128>( 7, "a" ) );
TEST_EQ( digest_from_hex( "8d786948560425241971dac7a9cf8411" ), test<ripemd_128>( 7, "abc" ) );
TEST_EQ( digest_from_hex( "dc0be47779611aaf5d3f01c542a47c8d" ), test<ripemd_128>( 7, "message digest" ) );
TEST_EQ( digest_from_hex( "55d084891941b4957e5708a19a20205d" ), test<ripemd_128>( 7, "abcdefghijklmnopqrstuvwxyz" ) );
TEST_EQ( digest_from_hex( "6f1c8c55ef315a5672f023d477978e04" ), test<ripemd_128>( 7, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" ) );
TEST_EQ( digest_from_hex( "02e8ba3888dc72487d45ef5e2332903f" ), test<ripemd_128>( 7, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" ) );
return boost::report_errors();
}