File: hmac_ripemd.cpp

package info (click to toggle)
boost1.90 1.90.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 593,120 kB
  • sloc: cpp: 4,190,908; xml: 196,648; python: 34,618; ansic: 23,145; asm: 5,468; sh: 3,774; makefile: 1,161; perl: 1,020; sql: 728; ruby: 676; yacc: 478; java: 77; lisp: 24; csh: 6
file content (91 lines) | stat: -rw-r--r-- 9,002 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Copyright 2024 Christian Mazakas.
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt

#define _CRT_SECURE_NO_WARNINGS

#ifdef _MSC_VER
# pragma warning(disable: 4309) // truncation of constant value
#endif

#include <boost/hash2/ripemd.hpp>
#include <boost/core/lightweight_test.hpp>
#include <string>
#include <cstddef>
#include <cstdio>

template<class H> std::string digest( std::string const k, std::string const & s )
{
    H h( k.data(), k.size() );

    h.update( s.data(), s.size() );

    return to_string( h.result() );
}

std::string from_hex( char const* str )
{
    auto f = []( char c ) { return ( c >= 'a' ? c - 'a' + 10 : c - '0' ); };

    std::string s;
    while( *str != '\0' )
    {
        s.push_back( static_cast<char>( ( f( str[ 0 ] ) << 4 ) + f( str[ 1 ] ) ) );
        str += 2;
    }
    return s;
}

using boost::hash2::hmac_ripemd_160;
using boost::hash2::hmac_ripemd_128;

int main()
{
    // Test vectors from https://datatracker.ietf.org/doc/rfc2286/

    BOOST_TEST_EQ( std::string( "24cb4bd67d20fc1a5d2ed7732dcc39377f0a5668" ), digest<hmac_ripemd_160>( from_hex( "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b" ), "Hi There" ) );
    BOOST_TEST_EQ( std::string( "dda6c0213a485a9e24f4742064a7f033b43c4069" ), digest<hmac_ripemd_160>( "Jefe", "what do ya want for nothing?" ) );
    BOOST_TEST_EQ( std::string( "b0b105360de759960ab4f35298e116e295d8e7c1" ), digest<hmac_ripemd_160>( from_hex( "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ), from_hex( "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" ) ) );
    BOOST_TEST_EQ( std::string( "d5ca862f4d21d5e610e18b4cf1beb97a4365ecf4" ), digest<hmac_ripemd_160>( from_hex( "0102030405060708090a0b0c0d0e0f10111213141516171819" ), from_hex( "cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd" ) ) );
    BOOST_TEST_EQ( std::string( "7619693978f91d90539ae786500ff3d8e0518e39" ), digest<hmac_ripemd_160>( from_hex( "0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c" ), "Test With Truncation" ) );
    BOOST_TEST_EQ( std::string( "6466ca07ac5eac29e1bd523e5ada7605b791fd8b" ), digest<hmac_ripemd_160>( from_hex( "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ), "Test Using Larger Than Block-Size Key - Hash Key First" ) );
    BOOST_TEST_EQ( std::string( "69ea60798d71616cce5fd0871e23754cd75d5a0a" ), digest<hmac_ripemd_160>( from_hex( "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ), "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data" ) );

    // Test vectors from https://homes.esat.kuleuven.be/%7Ebosselae/ripemd160.html

    BOOST_TEST_EQ( std::string( "cf387677bfda8483e63b57e06c3b5ecd8b7fc055" ), digest<hmac_ripemd_160>( from_hex( "00112233445566778899aabbccddeeff01234567" ), "" ) );
    BOOST_TEST_EQ( std::string( "fe69a66c7423eea9c8fa2eff8d9dafb4f17a62f5" ), digest<hmac_ripemd_160>( from_hex( "0123456789abcdeffedcba987654321000112233" ), "" ) );
    BOOST_TEST_EQ( std::string( "0d351d71b78e36dbb7391c810a0d2b6240ddbafc" ), digest<hmac_ripemd_160>( from_hex( "00112233445566778899aabbccddeeff01234567" ), "a" ) );
    BOOST_TEST_EQ( std::string( "85743e899bc82dbfa36faaa7a25b7cfd372432cd" ), digest<hmac_ripemd_160>( from_hex( "0123456789abcdeffedcba987654321000112233" ), "a" ) );
    BOOST_TEST_EQ( std::string( "f7ef288cb1bbcc6160d76507e0a3bbf712fb67d6" ), digest<hmac_ripemd_160>( from_hex( "00112233445566778899aabbccddeeff01234567" ), "abc" ) );
    BOOST_TEST_EQ( std::string( "6e4afd501fa6b4a1823ca3b10bd9aa0ba97ba182" ), digest<hmac_ripemd_160>( from_hex( "0123456789abcdeffedcba987654321000112233" ), "abc" ) );
    BOOST_TEST_EQ( std::string( "f83662cc8d339c227e600fcd636c57d2571b1c34" ), digest<hmac_ripemd_160>( from_hex( "00112233445566778899aabbccddeeff01234567" ), "message digest"  ) );
    BOOST_TEST_EQ( std::string( "2e066e624badb76a184c8f90fba053330e650e92" ), digest<hmac_ripemd_160>( from_hex( "0123456789abcdeffedcba987654321000112233" ), "message digest"  ) );
    BOOST_TEST_EQ( std::string( "843d1c4eb880ac8ac0c9c95696507957d0155ddb" ), digest<hmac_ripemd_160>( from_hex( "00112233445566778899aabbccddeeff01234567" ), "abcdefghijklmnopqrstuvwxyz" ) );
    BOOST_TEST_EQ( std::string( "07e942aa4e3cd7c04dedc1d46e2e8cc4c741b3d9" ), digest<hmac_ripemd_160>( from_hex( "0123456789abcdeffedcba987654321000112233" ), "abcdefghijklmnopqrstuvwxyz" ) );
    BOOST_TEST_EQ( std::string( "60f5ef198a2dd5745545c1f0c47aa3fb5776f881" ), digest<hmac_ripemd_160>( from_hex( "00112233445566778899aabbccddeeff01234567" ), "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" ) );
    BOOST_TEST_EQ( std::string( "b6582318ddcfb67a53a67d676b8ad869aded629a" ), digest<hmac_ripemd_160>( from_hex( "0123456789abcdeffedcba987654321000112233" ), "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" ) );
    BOOST_TEST_EQ( std::string( "e49c136a9e5627e0681b808a3b97e6a6e661ae79" ), digest<hmac_ripemd_160>( from_hex( "00112233445566778899aabbccddeeff01234567" ), "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" ) );
    BOOST_TEST_EQ( std::string( "f1be3ee877703140d34f97ea1ab3a07c141333e2" ), digest<hmac_ripemd_160>( from_hex( "0123456789abcdeffedcba987654321000112233" ), "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" ) );
    BOOST_TEST_EQ( std::string( "31be3cc98cee37b79b0619e3e1c2be4f1aa56e6c" ), digest<hmac_ripemd_160>( from_hex( "00112233445566778899aabbccddeeff01234567" ), "12345678901234567890123456789012345678901234567890123456789012345678901234567890" ) );
    BOOST_TEST_EQ( std::string( "85f164703e61a63131be7e45958e0794123904f9" ), digest<hmac_ripemd_160>( from_hex( "0123456789abcdeffedcba987654321000112233" ), "12345678901234567890123456789012345678901234567890123456789012345678901234567890" ) );

    BOOST_TEST_EQ( std::string( "ad9db2c1e22af9ab5ca9dbe5a86f67dc" ), digest<hmac_ripemd_128>( from_hex( "00112233445566778899aabbccddeeff" ), "" ) );
    BOOST_TEST_EQ( std::string( "8931eeee56a6b257fd1ab5418183d826" ), digest<hmac_ripemd_128>( from_hex( "0123456789abcdeffedcba9876543210" ), "" ) );
    BOOST_TEST_EQ( std::string( "3bf448c762de00bcfa0310b11c0bde4c" ), digest<hmac_ripemd_128>( from_hex( "00112233445566778899aabbccddeeff" ), "a" ) );
    BOOST_TEST_EQ( std::string( "dbbcf169ea7419d5ba7bd8eb3673ff2d" ), digest<hmac_ripemd_128>( from_hex( "0123456789abcdeffedcba9876543210" ), "a" ) );
    BOOST_TEST_EQ( std::string( "f34ec0945f02b70b8603f89e1ce4c78c" ), digest<hmac_ripemd_128>( from_hex( "00112233445566778899aabbccddeeff" ), "abc" ) );
    BOOST_TEST_EQ( std::string( "2c4cd07d3162d6a0e338004d6b6fbc9a" ), digest<hmac_ripemd_128>( from_hex( "0123456789abcdeffedcba9876543210" ), "abc" ) );
    BOOST_TEST_EQ( std::string( "e8503a8aec2289d82aa0d8d445a06bdd" ), digest<hmac_ripemd_128>( from_hex( "00112233445566778899aabbccddeeff" ), "message digest"  ) );
    BOOST_TEST_EQ( std::string( "75bfb25888f4bb77c77ae83ad0817447" ), digest<hmac_ripemd_128>( from_hex( "0123456789abcdeffedcba9876543210" ), "message digest"  ) );
    BOOST_TEST_EQ( std::string( "ee880b735ce3126065de1699cc136199" ), digest<hmac_ripemd_128>( from_hex( "00112233445566778899aabbccddeeff" ), "abcdefghijklmnopqrstuvwxyz" ) );
    BOOST_TEST_EQ( std::string( "b1b5dc0fcb7258758855dd1840fcdce4" ), digest<hmac_ripemd_128>( from_hex( "0123456789abcdeffedcba9876543210" ), "abcdefghijklmnopqrstuvwxyz" ) );
    BOOST_TEST_EQ( std::string( "794daf2e3bdeea2538638a5ced154434" ), digest<hmac_ripemd_128>( from_hex( "00112233445566778899aabbccddeeff" ), "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" ) );
    BOOST_TEST_EQ( std::string( "670d0f7a697b18f1a8ab7d2a2a00dbc1" ), digest<hmac_ripemd_128>( from_hex( "0123456789abcdeffedcba9876543210" ), "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" ) );
    BOOST_TEST_EQ( std::string( "3a06eef165b23625247800be23e232b6" ), digest<hmac_ripemd_128>( from_hex( "00112233445566778899aabbccddeeff" ), "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" ) );
    BOOST_TEST_EQ( std::string( "54e315fdb34a61c0475392e5c7852998" ), digest<hmac_ripemd_128>( from_hex( "0123456789abcdeffedcba9876543210" ), "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" ) );
    BOOST_TEST_EQ( std::string( "9a4f0159c0952da43a8d466d46b0af58" ), digest<hmac_ripemd_128>( from_hex( "00112233445566778899aabbccddeeff" ), "12345678901234567890123456789012345678901234567890123456789012345678901234567890" ) );
    BOOST_TEST_EQ( std::string( "ad04354d8aa2a623e72e3594ee3535c0" ), digest<hmac_ripemd_128>( from_hex( "0123456789abcdeffedcba9876543210" ), "12345678901234567890123456789012345678901234567890123456789012345678901234567890" ) );

    return boost::report_errors();
}