diff options
author | Thomas Markwalder <tmark@isc.org> | 2024-01-29 17:00:41 +0100 |
---|---|---|
committer | Thomas Markwalder <tmark@isc.org> | 2024-02-07 14:58:47 +0100 |
commit | b75e0f4c5091bd5dc624085bc6c9fe54246e184a (patch) | |
tree | d2eb3699dcb48aacd6002a1c976ec3304a2acd14 /src | |
parent | [#2022] Added PARK status handle (diff) | |
download | kea-b75e0f4c5091bd5dc624085bc6c9fe54246e184a.tar.xz kea-b75e0f4c5091bd5dc624085bc6c9fe54246e184a.zip |
[#3209] Initial commit
Rewrote encoding/decoding.
src/lib/util/Makefile.am
Removed old files, added encode.cc, encode.h
src/lib/util/encode/encode.*
New implemenentation encoding and decoding not based
on boost.
Diffstat (limited to 'src')
86 files changed, 450 insertions, 1229 deletions
diff --git a/src/bin/d2/tests/d2_cfg_mgr_unittests.cc b/src/bin/d2/tests/d2_cfg_mgr_unittests.cc index 09cca5f5b2..12c95a7f5b 100644 --- a/src/bin/d2/tests/d2_cfg_mgr_unittests.cc +++ b/src/bin/d2/tests/d2_cfg_mgr_unittests.cc @@ -15,7 +15,7 @@ #include <dhcpsrv/testutils/config_result_check.h> #include <process/testutils/d_test_stubs.h> #include <test_data_files_config.h> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <boost/scoped_ptr.hpp> #include <gtest/gtest.h> diff --git a/src/bin/dhcp4/ctrl_dhcp4_srv.cc b/src/bin/dhcp4/ctrl_dhcp4_srv.cc index 5ab8ce3ac0..90dc449964 100644 --- a/src/bin/dhcp4/ctrl_dhcp4_srv.cc +++ b/src/bin/dhcp4/ctrl_dhcp4_srv.cc @@ -26,7 +26,7 @@ #include <hooks/hooks_manager.h> #include <process/cfgrpt/config_report.h> #include <stats/stats_mgr.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/multi_threading_mgr.h> #include <signal.h> diff --git a/src/bin/dhcp4/json_config_parser.cc b/src/bin/dhcp4/json_config_parser.cc index 1ae2c0a382..6164c3c7d9 100644 --- a/src/bin/dhcp4/json_config_parser.cc +++ b/src/bin/dhcp4/json_config_parser.cc @@ -40,7 +40,7 @@ #include <hooks/hooks_manager.h> #include <hooks/hooks_parser.h> #include <process/config_ctl_parser.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/multi_threading_mgr.h> #include <util/strutil.h> diff --git a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc index 545cbabb54..521dad3124 100644 --- a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc +++ b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc @@ -34,7 +34,7 @@ #include <dhcpsrv/host_mgr.h> #include <stats/stats_mgr.h> #include <testutils/gtest_utils.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #ifdef HAVE_MYSQL #include <mysql/testutils/mysql_schema.h> diff --git a/src/bin/dhcp6/ctrl_dhcp6_srv.cc b/src/bin/dhcp6/ctrl_dhcp6_srv.cc index 4a6e4e84a9..fe4200a682 100644 --- a/src/bin/dhcp6/ctrl_dhcp6_srv.cc +++ b/src/bin/dhcp6/ctrl_dhcp6_srv.cc @@ -26,7 +26,7 @@ #include <hooks/hooks_manager.h> #include <process/cfgrpt/config_report.h> #include <stats/stats_mgr.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/multi_threading_mgr.h> #include <signal.h> diff --git a/src/bin/dhcp6/dhcp6_srv.cc b/src/bin/dhcp6/dhcp6_srv.cc index 4a0e045168..25e3571030 100644 --- a/src/bin/dhcp6/dhcp6_srv.cc +++ b/src/bin/dhcp6/dhcp6_srv.cc @@ -47,7 +47,7 @@ #include <hooks/hooks_log.h> #include <hooks/hooks_manager.h> #include <stats/stats_mgr.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/io_utilities.h> #include <util/pointer_util.h> #include <util/range_utilities.h> diff --git a/src/bin/dhcp6/json_config_parser.cc b/src/bin/dhcp6/json_config_parser.cc index 27f603bd9c..8fd4e15743 100644 --- a/src/bin/dhcp6/json_config_parser.cc +++ b/src/bin/dhcp6/json_config_parser.cc @@ -43,7 +43,7 @@ #include <hooks/hooks_parser.h> #include <log/logger_support.h> #include <process/config_ctl_parser.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/multi_threading_mgr.h> #include <util/strutil.h> #include <util/triplet.h> diff --git a/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc b/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc index 1e0d43e4b8..a7f6648fcb 100644 --- a/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc +++ b/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc @@ -35,7 +35,7 @@ #include <testutils/gtest_utils.h> #include <util/buffer.h> #include <util/range_utilities.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #ifdef HAVE_MYSQL #include <mysql/testutils/mysql_schema.h> diff --git a/src/bin/perfdhcp/command_options.cc b/src/bin/perfdhcp/command_options.cc index fa6772e60d..dca896939d 100644 --- a/src/bin/perfdhcp/command_options.cc +++ b/src/bin/perfdhcp/command_options.cc @@ -14,7 +14,7 @@ #include <dhcp/duid.h> #include <dhcp/option.h> #include <process/cfgrpt/config_report.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <boost/lexical_cast.hpp> #include <boost/date_time/posix_time/posix_time.hpp> diff --git a/src/hooks/dhcp/lease_cmds/lease_cmds.cc b/src/hooks/dhcp/lease_cmds/lease_cmds.cc index 9054831b30..534d6f5516 100644 --- a/src/hooks/dhcp/lease_cmds/lease_cmds.cc +++ b/src/hooks/dhcp/lease_cmds/lease_cmds.cc @@ -27,7 +27,7 @@ #include <lease_parser.h> #include <lease_cmds_log.h> #include <stats/stats_mgr.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/multi_threading_mgr.h> #include <util/strutil.h> diff --git a/src/hooks/dhcp/user_chk/user.cc b/src/hooks/dhcp/user_chk/user.cc index df571cf57f..2c780de091 100644 --- a/src/hooks/dhcp/user_chk/user.cc +++ b/src/hooks/dhcp/user_chk/user.cc @@ -9,7 +9,7 @@ #include <dhcp/hwaddr.h> #include <dhcp/duid.h> #include <exceptions/exceptions.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <user.h> diff --git a/src/lib/config/base_command_mgr.cc b/src/lib/config/base_command_mgr.cc index 4963afa37f..064303b841 100644 --- a/src/lib/config/base_command_mgr.cc +++ b/src/lib/config/base_command_mgr.cc @@ -12,7 +12,7 @@ #include <cryptolink/crypto_hash.h> #include <hooks/callout_handle.h> #include <hooks/hooks_manager.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/buffer.h> #include <functional> #include <vector> diff --git a/src/lib/cryptolink/tests/crypto_unittests.cc b/src/lib/cryptolink/tests/crypto_unittests.cc index 9edb52d4a6..54c5c9af63 100644 --- a/src/lib/cryptolink/tests/crypto_unittests.cc +++ b/src/lib/cryptolink/tests/crypto_unittests.cc @@ -8,7 +8,7 @@ #include <gtest/gtest.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <cryptolink/cryptolink.h> #include <cryptolink/crypto_rng.h> diff --git a/src/lib/cryptolink/tests/hash_unittests.cc b/src/lib/cryptolink/tests/hash_unittests.cc index d2e93968cf..0500c35107 100644 --- a/src/lib/cryptolink/tests/hash_unittests.cc +++ b/src/lib/cryptolink/tests/hash_unittests.cc @@ -13,7 +13,7 @@ #include <gtest/gtest.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <cryptolink/cryptolink.h> #include <cryptolink/crypto_hash.h> diff --git a/src/lib/cryptolink/tests/hmac_unittests.cc b/src/lib/cryptolink/tests/hmac_unittests.cc index d0c5cd9b45..0fabf92640 100644 --- a/src/lib/cryptolink/tests/hmac_unittests.cc +++ b/src/lib/cryptolink/tests/hmac_unittests.cc @@ -13,7 +13,7 @@ #include <gtest/gtest.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <cryptolink/cryptolink.h> #include <cryptolink/crypto_hmac.h> diff --git a/src/lib/d2srv/d2_cfg_mgr.cc b/src/lib/d2srv/d2_cfg_mgr.cc index 0244672483..bf7df10dee 100644 --- a/src/lib/d2srv/d2_cfg_mgr.cc +++ b/src/lib/d2srv/d2_cfg_mgr.cc @@ -11,7 +11,7 @@ #include <d2srv/d2_simple_parser.h> #include <cc/command_interpreter.h> #include <config/base_command_mgr.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <boost/range/adaptor/reversed.hpp> using namespace isc::asiolink; diff --git a/src/lib/d2srv/testutils/nc_test_utils.cc b/src/lib/d2srv/testutils/nc_test_utils.cc index 94cc2e6176..b0f47c18e4 100644 --- a/src/lib/d2srv/testutils/nc_test_utils.cc +++ b/src/lib/d2srv/testutils/nc_test_utils.cc @@ -11,7 +11,7 @@ #include <d2srv/testutils/nc_test_utils.h> #include <dns/messagerenderer.h> #include <dns/opcode.h> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <gtest/gtest.h> diff --git a/src/lib/dhcp/option.cc b/src/lib/dhcp/option.cc index 95353efb98..8e9a03a505 100644 --- a/src/lib/dhcp/option.cc +++ b/src/lib/dhcp/option.cc @@ -10,7 +10,7 @@ #include <dhcp/option.h> #include <dhcp/option_space.h> #include <exceptions/exceptions.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/io_utilities.h> #include <boost/make_shared.hpp> diff --git a/src/lib/dhcp/option6_auth.cc b/src/lib/dhcp/option6_auth.cc index 4b5806d98f..8ce63a1c8d 100644 --- a/src/lib/dhcp/option6_auth.cc +++ b/src/lib/dhcp/option6_auth.cc @@ -11,7 +11,7 @@ #include <dhcp/option_space.h> #include <exceptions/exceptions.h> #include <util/io_utilities.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <sstream> #include <stdint.h> diff --git a/src/lib/dhcp/option6_pdexclude.cc b/src/lib/dhcp/option6_pdexclude.cc index b71a820cbe..4e785e5db7 100644 --- a/src/lib/dhcp/option6_pdexclude.cc +++ b/src/lib/dhcp/option6_pdexclude.cc @@ -10,7 +10,7 @@ #include <dhcp/dhcp6.h> #include <dhcp/option6_pdexclude.h> #include <exceptions/exceptions.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/io_utilities.h> #include <boost/dynamic_bitset.hpp> diff --git a/src/lib/dhcp/option_custom.cc b/src/lib/dhcp/option_custom.cc index 08c3c74be8..f1a4b04105 100644 --- a/src/lib/dhcp/option_custom.cc +++ b/src/lib/dhcp/option_custom.cc @@ -9,7 +9,7 @@ #include <dhcp/option_data_types.h> #include <dhcp/option_custom.h> #include <exceptions/isc_assert.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> using namespace isc::asiolink; diff --git a/src/lib/dhcp/option_data_types.cc b/src/lib/dhcp/option_data_types.cc index 60aa9c3b19..0308d8c6a3 100644 --- a/src/lib/dhcp/option_data_types.cc +++ b/src/lib/dhcp/option_data_types.cc @@ -10,7 +10,7 @@ #include <dns/labelsequence.h> #include <dns/name.h> #include <util/strutil.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <algorithm> #include <limits> diff --git a/src/lib/dhcp/option_definition.cc b/src/lib/dhcp/option_definition.cc index 4f0d188280..d07d61da71 100644 --- a/src/lib/dhcp/option_definition.cc +++ b/src/lib/dhcp/option_definition.cc @@ -28,7 +28,7 @@ #include <dhcp/option_string.h> #include <dhcp/option_vendor.h> #include <dhcp/option_vendor_class.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <dns/labelsequence.h> #include <dns/name.h> #include <util/strutil.h> diff --git a/src/lib/dhcp/tests/duid_factory_unittest.cc b/src/lib/dhcp/tests/duid_factory_unittest.cc index 824930c09b..5a7a400c21 100644 --- a/src/lib/dhcp/tests/duid_factory_unittest.cc +++ b/src/lib/dhcp/tests/duid_factory_unittest.cc @@ -9,7 +9,7 @@ #include <dhcp/duid_factory.h> #include <dhcp/testutils/iface_mgr_test_config.h> #include <testutils/io_utils.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/range_utilities.h> #include <boost/algorithm/string.hpp> #include <gtest/gtest.h> diff --git a/src/lib/dhcp/tests/libdhcp++_unittest.cc b/src/lib/dhcp/tests/libdhcp++_unittest.cc index 327b0dba99..f6f262aeef 100644 --- a/src/lib/dhcp/tests/libdhcp++_unittest.cc +++ b/src/lib/dhcp/tests/libdhcp++_unittest.cc @@ -28,7 +28,7 @@ #include <dhcp/option_vendor.h> #include <dhcp/option_vendor_class.h> #include <util/buffer.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/thread_pool.h> #include <boost/pointer_cast.hpp> diff --git a/src/lib/dhcp/tests/option6_pdexclude_unittest.cc b/src/lib/dhcp/tests/option6_pdexclude_unittest.cc index b119fc2a5b..c1da0e1066 100644 --- a/src/lib/dhcp/tests/option6_pdexclude_unittest.cc +++ b/src/lib/dhcp/tests/option6_pdexclude_unittest.cc @@ -12,7 +12,7 @@ #include <exceptions/exceptions.h> #include <dhcp/option6_pdexclude.h> #include <util/buffer.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <gtest/gtest.h> using namespace isc; diff --git a/src/lib/dhcp/tests/option_vendor_unittest.cc b/src/lib/dhcp/tests/option_vendor_unittest.cc index bb764004f4..906cb6efd8 100644 --- a/src/lib/dhcp/tests/option_vendor_unittest.cc +++ b/src/lib/dhcp/tests/option_vendor_unittest.cc @@ -15,7 +15,7 @@ #include <dhcp/option_int_array.h> #include <exceptions/exceptions.h> #include <util/buffer.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <boost/scoped_ptr.hpp> #include <gtest/gtest.h> diff --git a/src/lib/dhcp/tests/pkt4_unittest.cc b/src/lib/dhcp/tests/pkt4_unittest.cc index cf82aad05c..db07f2bd58 100644 --- a/src/lib/dhcp/tests/pkt4_unittest.cc +++ b/src/lib/dhcp/tests/pkt4_unittest.cc @@ -19,7 +19,7 @@ #include <exceptions/exceptions.h> #include <testutils/gtest_utils.h> #include <util/buffer.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <boost/shared_array.hpp> #include <boost/shared_ptr.hpp> diff --git a/src/lib/dhcp/tests/pkt6_unittest.cc b/src/lib/dhcp/tests/pkt6_unittest.cc index 280bb6447a..eee590883c 100644 --- a/src/lib/dhcp/tests/pkt6_unittest.cc +++ b/src/lib/dhcp/tests/pkt6_unittest.cc @@ -28,7 +28,7 @@ #include <boost/range/adaptor/reversed.hpp> #include <boost/scoped_ptr.hpp> #include <boost/pointer_cast.hpp> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <gtest/gtest.h> #include <algorithm> diff --git a/src/lib/dhcp/testutils/pkt_captures4.cc b/src/lib/dhcp/testutils/pkt_captures4.cc index aa1033e35d..81cc85509a 100644 --- a/src/lib/dhcp/testutils/pkt_captures4.cc +++ b/src/lib/dhcp/testutils/pkt_captures4.cc @@ -8,7 +8,7 @@ #include <asiolink/io_address.h> #include <dhcp/testutils/pkt_captures.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <string> diff --git a/src/lib/dhcp/testutils/pkt_captures6.cc b/src/lib/dhcp/testutils/pkt_captures6.cc index 5a0c45bb04..72e23886ec 100644 --- a/src/lib/dhcp/testutils/pkt_captures6.cc +++ b/src/lib/dhcp/testutils/pkt_captures6.cc @@ -8,7 +8,7 @@ #include <dhcp/pkt6.h> #include <dhcp/testutils/pkt_captures.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <string> diff --git a/src/lib/dhcp_ddns/ncr_msg.cc b/src/lib/dhcp_ddns/ncr_msg.cc index 95afc5fc6e..82c3ba9ae3 100644 --- a/src/lib/dhcp_ddns/ncr_msg.cc +++ b/src/lib/dhcp_ddns/ncr_msg.cc @@ -11,7 +11,7 @@ #include <asiolink/io_error.h> #include <cryptolink/cryptolink.h> #include <cryptolink/crypto_hash.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <boost/algorithm/string/predicate.hpp> diff --git a/src/lib/dhcpsrv/alloc_engine.cc b/src/lib/dhcpsrv/alloc_engine.cc index bbbb2fa04b..a10c0c5437 100644 --- a/src/lib/dhcpsrv/alloc_engine.cc +++ b/src/lib/dhcpsrv/alloc_engine.cc @@ -28,7 +28,7 @@ #include <hooks/hooks_manager.h> #include <dhcpsrv/callout_handle_store.h> #include <stats/stats_mgr.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/stopwatch.h> #include <hooks/server_hooks.h> diff --git a/src/lib/dhcpsrv/cfg_duid.cc b/src/lib/dhcpsrv/cfg_duid.cc index fe17f208cb..6a440003dd 100644 --- a/src/lib/dhcpsrv/cfg_duid.cc +++ b/src/lib/dhcpsrv/cfg_duid.cc @@ -8,7 +8,7 @@ #include <dhcp/duid_factory.h> #include <dhcpsrv/cfg_duid.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/strutil.h> #include <iostream> #include <string> diff --git a/src/lib/dhcpsrv/cfg_hosts.cc b/src/lib/dhcpsrv/cfg_hosts.cc index 168e2a16f0..433aabe2e9 100644 --- a/src/lib/dhcpsrv/cfg_hosts.cc +++ b/src/lib/dhcpsrv/cfg_hosts.cc @@ -12,7 +12,7 @@ #include <dhcpsrv/hosts_log.h> #include <dhcpsrv/cfgmgr.h> #include <exceptions/exceptions.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <boost/foreach.hpp> #include <ostream> #include <string> diff --git a/src/lib/dhcpsrv/cfg_option.cc b/src/lib/dhcpsrv/cfg_option.cc index 7c2a7dd436..27ae10b14e 100644 --- a/src/lib/dhcpsrv/cfg_option.cc +++ b/src/lib/dhcpsrv/cfg_option.cc @@ -10,7 +10,7 @@ #include <dhcpsrv/cfg_option.h> #include <dhcp/dhcp6.h> #include <dhcp/option_space.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <boost/algorithm/string/split.hpp> #include <boost/algorithm/string/classification.hpp> #include <boost/make_shared.hpp> diff --git a/src/lib/dhcpsrv/host.cc b/src/lib/dhcpsrv/host.cc index 47502c0f9e..4390dba322 100644 --- a/src/lib/dhcpsrv/host.cc +++ b/src/lib/dhcpsrv/host.cc @@ -13,7 +13,7 @@ #include <dhcpsrv/host.h> #include <exceptions/exceptions.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/strutil.h> #include <boost/foreach.hpp> diff --git a/src/lib/dhcpsrv/lease_mgr.cc b/src/lib/dhcpsrv/lease_mgr.cc index 6f764aec0e..38164ce0e4 100644 --- a/src/lib/dhcpsrv/lease_mgr.cc +++ b/src/lib/dhcpsrv/lease_mgr.cc @@ -13,7 +13,7 @@ #include <dhcpsrv/lease_mgr.h> #include <exceptions/exceptions.h> #include <stats/stats_mgr.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <boost/algorithm/string.hpp> diff --git a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc index 7f44cc4e75..78077b5986 100644 --- a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc +++ b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc @@ -18,7 +18,7 @@ #include <dhcpsrv/parsers/simple_parser4.h> #include <dhcpsrv/parsers/simple_parser6.h> #include <dhcpsrv/cfg_mac_source.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/strutil.h> #include <boost/algorithm/string.hpp> diff --git a/src/lib/dhcpsrv/parsers/option_data_parser.cc b/src/lib/dhcpsrv/parsers/option_data_parser.cc index d1211d5516..8ec49a0309 100644 --- a/src/lib/dhcpsrv/parsers/option_data_parser.cc +++ b/src/lib/dhcpsrv/parsers/option_data_parser.cc @@ -15,7 +15,7 @@ #include <dhcpsrv/parsers/option_data_parser.h> #include <dhcpsrv/parsers/simple_parser4.h> #include <dhcpsrv/parsers/simple_parser6.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/strutil.h> #include <boost/make_shared.hpp> #include <limits> diff --git a/src/lib/dhcpsrv/tests/cfg_duid_unittest.cc b/src/lib/dhcpsrv/tests/cfg_duid_unittest.cc index 10da5b9b4f..939a9a84f0 100644 --- a/src/lib/dhcpsrv/tests/cfg_duid_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_duid_unittest.cc @@ -11,7 +11,7 @@ #include <exceptions/exceptions.h> #include <testutils/io_utils.h> #include <testutils/test_to_element.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <gtest/gtest.h> #include <stdint.h> #include <stdio.h> diff --git a/src/lib/dhcpsrv/tests/duid_config_parser_unittest.cc b/src/lib/dhcpsrv/tests/duid_config_parser_unittest.cc index be7e96bf9b..79de77e460 100644 --- a/src/lib/dhcpsrv/tests/duid_config_parser_unittest.cc +++ b/src/lib/dhcpsrv/tests/duid_config_parser_unittest.cc @@ -12,7 +12,7 @@ #include <dhcpsrv/parsers/dhcp_parsers.h> #include <dhcpsrv/testutils/config_result_check.h> #include <testutils/test_to_element.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <gtest/gtest.h> #include <limits> #include <sstream> diff --git a/src/lib/dhcpsrv/tests/host_unittest.cc b/src/lib/dhcpsrv/tests/host_unittest.cc index ae1fdd096f..4ac51e112b 100644 --- a/src/lib/dhcpsrv/tests/host_unittest.cc +++ b/src/lib/dhcpsrv/tests/host_unittest.cc @@ -9,7 +9,7 @@ #include <dhcpsrv/host.h> #include <dhcp/option_space.h> #include <testutils/gtest_utils.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/range_utilities.h> #include <boost/foreach.hpp> #include <boost/scoped_ptr.hpp> @@ -1443,7 +1443,7 @@ TEST(AuthKeyTest, basicTest) { ASSERT_EQ(key16ByteStr, defaultTestKey.toText()); ASSERT_EQ(key16ByteBin, defaultTestKey.getAuthKey()); - string expected = "bad auth key: attempt to decode a value not in base16 char set"; + string expected = "bad auth key: attempt to decode a value not in base16 char set: 0123456789abcdefgh"; ASSERT_THROW_MSG(defaultTestKey.setAuthKey(key18ByteStr), BadValue, expected); } diff --git a/src/lib/dhcpsrv/tests/sanity_checks_unittest.cc b/src/lib/dhcpsrv/tests/sanity_checks_unittest.cc index 7185b931ae..df297ea5ce 100644 --- a/src/lib/dhcpsrv/tests/sanity_checks_unittest.cc +++ b/src/lib/dhcpsrv/tests/sanity_checks_unittest.cc @@ -886,7 +886,7 @@ TEST_F(ExtendedInfoChecksTest, badEncodingRemoteId4strict) { { "DHCPSRV_LEASE4_EXTENDED_INFO_SANITY_FAIL" " extended info for lease 192.168.1.1 failed checks" " (in remote-id a problem was found:" - " attempt to decode a value not in base16 char set)" }); + " attempt to decode a value not in base16 char set: foo)" }); } // Empty remote-id entry is right up to the fix sanity level. @@ -965,7 +965,7 @@ TEST_F(ExtendedInfoChecksTest, badEncodingRelayId4strict) { { "DHCPSRV_LEASE4_EXTENDED_INFO_SANITY_FAIL" " extended info for lease 192.168.1.1 failed checks" " (in relay-id a problem was found:" - " attempt to decode a value not in base16 char set)" }); + " attempt to decode a value not in base16 char set: foo)" }); } // Empty relay-id entry is right up to the fix sanity level. @@ -1409,7 +1409,7 @@ TEST_F(ExtendedInfoChecksTest, badEncodingRemoteId6strict) { { "DHCPSRV_LEASE6_EXTENDED_INFO_SANITY_FAIL" " extended info for lease 2001::1 failed checks" " (in remote-id [relay#0] a problem was found:" - " attempt to decode a value not in base16 char set)" }); + " attempt to decode a value not in base16 char set: foo)" }); } // Empty remote-id entry is dropped at strict or higher sanity levels. @@ -1470,7 +1470,7 @@ TEST_F(ExtendedInfoChecksTest, badEncodingRelayId6strict) { { "DHCPSRV_LEASE6_EXTENDED_INFO_SANITY_FAIL" " extended info for lease 2001::1 failed checks" " (in relay-id [relay#0] a problem was found:" - " attempt to decode a value not in base16 char set)" }); + " attempt to decode a value not in base16 char set: foo)" }); } // Empty relay-id entry is dropped at strict or higher sanity levels. diff --git a/src/lib/dns/nsec3hash.cc b/src/lib/dns/nsec3hash.cc index a0049152e5..83e7d70c78 100644 --- a/src/lib/dns/nsec3hash.cc +++ b/src/lib/dns/nsec3hash.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2023 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2024 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -20,7 +20,7 @@ #include <exceptions/exceptions.h> #include <util/buffer.h> -#include <util/encode/base32hex.h> +#include <util/encode/encode.h> #include <cryptolink/cryptolink.h> #include <cryptolink/crypto_hash.h> diff --git a/src/lib/dns/rdata.cc b/src/lib/dns/rdata.cc index 357ccc7cdf..45e9a3ed1c 100644 --- a/src/lib/dns/rdata.cc +++ b/src/lib/dns/rdata.cc @@ -9,7 +9,7 @@ #include <exceptions/exceptions.h> #include <util/buffer.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <dns/name.h> #include <dns/messagerenderer.h> diff --git a/src/lib/dns/rdata/any_255/tsig_250.cc b/src/lib/dns/rdata/any_255/tsig_250.cc index a80d742d09..4b20fd643d 100644 --- a/src/lib/dns/rdata/any_255/tsig_250.cc +++ b/src/lib/dns/rdata/any_255/tsig_250.cc @@ -13,7 +13,7 @@ #include <boost/lexical_cast.hpp> #include <util/buffer.h> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <dns/messagerenderer.h> #include <dns/name.h> diff --git a/src/lib/dns/rdata/generic/detail/nsec3param_common.cc b/src/lib/dns/rdata/generic/detail/nsec3param_common.cc index efe488a8a1..cc90558ff8 100644 --- a/src/lib/dns/rdata/generic/detail/nsec3param_common.cc +++ b/src/lib/dns/rdata/generic/detail/nsec3param_common.cc @@ -8,7 +8,7 @@ #include <exceptions/exceptions.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/buffer.h> #include <dns/exceptions.h> diff --git a/src/lib/dns/rdata/generic/dlv_32769.cc b/src/lib/dns/rdata/generic/dlv_32769.cc index 66303b7a57..78424cc0db 100644 --- a/src/lib/dns/rdata/generic/dlv_32769.cc +++ b/src/lib/dns/rdata/generic/dlv_32769.cc @@ -9,7 +9,7 @@ #include <string> #include <util/buffer.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <dns/messagerenderer.h> #include <dns/rdata.h> diff --git a/src/lib/dns/rdata/generic/dnskey_48.cc b/src/lib/dns/rdata/generic/dnskey_48.cc index df5d833394..ec7668b7cc 100644 --- a/src/lib/dns/rdata/generic/dnskey_48.cc +++ b/src/lib/dns/rdata/generic/dnskey_48.cc @@ -13,7 +13,7 @@ #include <boost/lexical_cast.hpp> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <util/buffer.h> #include <dns/messagerenderer.h> #include <dns/name.h> diff --git a/src/lib/dns/rdata/generic/ds_43.cc b/src/lib/dns/rdata/generic/ds_43.cc index 48c421c4d8..5f193c508a 100644 --- a/src/lib/dns/rdata/generic/ds_43.cc +++ b/src/lib/dns/rdata/generic/ds_43.cc @@ -9,7 +9,7 @@ #include <string> #include <util/buffer.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <dns/messagerenderer.h> #include <dns/rdata.h> diff --git a/src/lib/dns/rdata/generic/nsec3_50.cc b/src/lib/dns/rdata/generic/nsec3_50.cc index e99c109807..2de3fd6e48 100644 --- a/src/lib/dns/rdata/generic/nsec3_50.cc +++ b/src/lib/dns/rdata/generic/nsec3_50.cc @@ -15,8 +15,7 @@ #include <boost/lexical_cast.hpp> -#include <util/encode/base32hex.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/buffer.h> #include <dns/exceptions.h> diff --git a/src/lib/dns/rdata/generic/nsec3param_51.cc b/src/lib/dns/rdata/generic/nsec3param_51.cc index 2d28a69885..883291a222 100644 --- a/src/lib/dns/rdata/generic/nsec3param_51.cc +++ b/src/lib/dns/rdata/generic/nsec3param_51.cc @@ -7,7 +7,7 @@ #include <config.h> #include <util/buffer.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <dns/messagerenderer.h> #include <dns/rdata.h> diff --git a/src/lib/dns/rdata/generic/nsec_47.cc b/src/lib/dns/rdata/generic/nsec_47.cc index f8af0e0142..d3c7bac3ce 100644 --- a/src/lib/dns/rdata/generic/nsec_47.cc +++ b/src/lib/dns/rdata/generic/nsec_47.cc @@ -11,7 +11,7 @@ #include <sstream> #include <vector> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <util/buffer.h> #include <dns/exceptions.h> #include <dns/messagerenderer.h> diff --git a/src/lib/dns/rdata/generic/rrsig_46.cc b/src/lib/dns/rdata/generic/rrsig_46.cc index de92c67c34..da5f1f63f7 100644 --- a/src/lib/dns/rdata/generic/rrsig_46.cc +++ b/src/lib/dns/rdata/generic/rrsig_46.cc @@ -14,7 +14,7 @@ #include <boost/lexical_cast.hpp> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <util/buffer.h> #include <util/time_utilities.h> #include <dns/messagerenderer.h> diff --git a/src/lib/dns/rdata/generic/sshfp_44.cc b/src/lib/dns/rdata/generic/sshfp_44.cc index a08a17fcb0..7ac36a3581 100644 --- a/src/lib/dns/rdata/generic/sshfp_44.cc +++ b/src/lib/dns/rdata/generic/sshfp_44.cc @@ -11,7 +11,7 @@ #include <exceptions/exceptions.h> #include <util/buffer.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <dns/name.h> #include <dns/messagerenderer.h> #include <dns/rdata.h> diff --git a/src/lib/dns/rdata/generic/tkey_249.cc b/src/lib/dns/rdata/generic/tkey_249.cc index 435a345ac5..cace535a48 100644 --- a/src/lib/dns/rdata/generic/tkey_249.cc +++ b/src/lib/dns/rdata/generic/tkey_249.cc @@ -13,7 +13,7 @@ #include <boost/lexical_cast.hpp> #include <util/buffer.h> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <util/time_utilities.h> #include <dns/messagerenderer.h> diff --git a/src/lib/dns/rdata/generic/tlsa_52.cc b/src/lib/dns/rdata/generic/tlsa_52.cc index 330b7a2c82..94183d4127 100644 --- a/src/lib/dns/rdata/generic/tlsa_52.cc +++ b/src/lib/dns/rdata/generic/tlsa_52.cc @@ -11,7 +11,7 @@ #include <exceptions/exceptions.h> #include <util/buffer.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <dns/name.h> #include <dns/messagerenderer.h> #include <dns/rdata.h> diff --git a/src/lib/dns/rdata/in_1/dhcid_49.cc b/src/lib/dns/rdata/in_1/dhcid_49.cc index 57c79c2d23..4d36b278ef 100644 --- a/src/lib/dns/rdata/in_1/dhcid_49.cc +++ b/src/lib/dns/rdata/in_1/dhcid_49.cc @@ -12,7 +12,7 @@ #include <exceptions/exceptions.h> #include <util/buffer.h> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <dns/exceptions.h> #include <dns/messagerenderer.h> #include <dns/rdata.h> diff --git a/src/lib/dns/rdataclass.cc b/src/lib/dns/rdataclass.cc index d27d65f743..d9cb93f50c 100644 --- a/src/lib/dns/rdataclass.cc +++ b/src/lib/dns/rdataclass.cc @@ -20,7 +20,7 @@ #include <boost/lexical_cast.hpp> #include <util/buffer.h> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <dns/messagerenderer.h> #include <dns/name.h> @@ -1291,7 +1291,7 @@ CNAME::getCname() const { #include <string> #include <util/buffer.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <dns/messagerenderer.h> #include <dns/rdata.h> @@ -1550,7 +1550,7 @@ DNAME::getDname() const { #include <boost/lexical_cast.hpp> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <util/buffer.h> #include <dns/messagerenderer.h> #include <dns/name.h> @@ -1865,7 +1865,7 @@ DNSKEY::getAlgorithm() const { #include <string> #include <util/buffer.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <dns/messagerenderer.h> #include <dns/rdata.h> @@ -2846,8 +2846,7 @@ NS::getNSName() const { #include <boost/lexical_cast.hpp> -#include <util/encode/base32hex.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/buffer.h> #include <dns/exceptions.h> @@ -3185,7 +3184,7 @@ NSEC3::getNext() const { #include <config.h> #include <util/buffer.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <dns/messagerenderer.h> #include <dns/rdata.h> @@ -3425,7 +3424,7 @@ NSEC3PARAM::getSalt() const { #include <sstream> #include <vector> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <util/buffer.h> #include <dns/exceptions.h> #include <dns/messagerenderer.h> @@ -4160,7 +4159,7 @@ RP::compare(const Rdata& other) const { #include <boost/lexical_cast.hpp> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <util/buffer.h> #include <util/time_utilities.h> #include <dns/messagerenderer.h> @@ -4852,7 +4851,7 @@ SPF::compare(const Rdata& other) const { #include <exceptions/exceptions.h> #include <util/buffer.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <dns/name.h> #include <dns/messagerenderer.h> #include <dns/rdata.h> @@ -5156,7 +5155,7 @@ SSHFP::getFingerprintLength() const { #include <boost/lexical_cast.hpp> #include <util/buffer.h> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <util/time_utilities.h> #include <dns/messagerenderer.h> @@ -5771,7 +5770,7 @@ TKEY::getOtherData() const { #include <exceptions/exceptions.h> #include <util/buffer.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <dns/name.h> #include <dns/messagerenderer.h> #include <dns/rdata.h> @@ -6620,7 +6619,7 @@ AAAA::compare(const Rdata& other) const { #include <exceptions/exceptions.h> #include <util/buffer.h> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <dns/exceptions.h> #include <dns/messagerenderer.h> #include <dns/rdata.h> diff --git a/src/lib/dns/tests/nsec3hash_unittest.cc b/src/lib/dns/tests/nsec3hash_unittest.cc index b47bb4969b..b447fa443a 100644 --- a/src/lib/dns/tests/nsec3hash_unittest.cc +++ b/src/lib/dns/tests/nsec3hash_unittest.cc @@ -15,7 +15,7 @@ #include <dns/nsec3hash.h> #include <dns/labelsequence.h> #include <dns/rdataclass.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> using boost::scoped_ptr; using namespace std; diff --git a/src/lib/dns/tests/rdata_dhcid_unittest.cc b/src/lib/dns/tests/rdata_dhcid_unittest.cc index a96c3e4547..e603ff45b5 100644 --- a/src/lib/dns/tests/rdata_dhcid_unittest.cc +++ b/src/lib/dns/tests/rdata_dhcid_unittest.cc @@ -10,7 +10,7 @@ #include <util/buffer.h> #include <dns/rdataclass.h> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <gtest/gtest.h> diff --git a/src/lib/dns/tests/tsig_unittest.cc b/src/lib/dns/tests/tsig_unittest.cc index fde67bc1e0..2e58ca7c8c 100644 --- a/src/lib/dns/tests/tsig_unittest.cc +++ b/src/lib/dns/tests/tsig_unittest.cc @@ -18,7 +18,7 @@ #include <exceptions/exceptions.h> #include <util/buffer.h> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <util/unittests/newhook.h> #include <util/time_utilities.h> diff --git a/src/lib/dns/tsigkey.cc b/src/lib/dns/tsigkey.cc index ad94b623cb..9f1eaf31ab 100644 --- a/src/lib/dns/tsigkey.cc +++ b/src/lib/dns/tsigkey.cc @@ -16,7 +16,7 @@ #include <cryptolink/cryptolink.h> #include <dns/name.h> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <dns/tsigkey.h> #include <boost/lexical_cast.hpp> diff --git a/src/lib/eval/token.cc b/src/lib/eval/token.cc index ff965d33f9..45b11db57f 100644 --- a/src/lib/eval/token.cc +++ b/src/lib/eval/token.cc @@ -9,7 +9,7 @@ #include <eval/token.h> #include <eval/eval_log.h> #include <eval/eval_context.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/io_utilities.h> #include <asiolink/io_address.h> #include <dhcp/pkt4.h> diff --git a/src/lib/http/basic_auth.cc b/src/lib/http/basic_auth.cc index f3a1d871ef..2f048c939a 100644 --- a/src/lib/http/basic_auth.cc +++ b/src/lib/http/basic_auth.cc @@ -7,7 +7,7 @@ #include <config.h> #include <http/basic_auth.h> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <util/encode/utf8.h> using namespace isc::util::encode; diff --git a/src/lib/process/d_cfg_mgr.cc b/src/lib/process/d_cfg_mgr.cc index 8af77d08b2..24ead16d3b 100644 --- a/src/lib/process/d_cfg_mgr.cc +++ b/src/lib/process/d_cfg_mgr.cc @@ -12,7 +12,7 @@ #include <process/d_cfg_mgr.h> #include <process/daemon.h> #include <process/redact_config.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/strutil.h> #include <boost/lexical_cast.hpp> diff --git a/src/lib/process/d_controller.cc b/src/lib/process/d_controller.cc index 5ec51ba7bc..7946a5c66d 100644 --- a/src/lib/process/d_controller.cc +++ b/src/lib/process/d_controller.cc @@ -13,7 +13,7 @@ #include <hooks/hooks_manager.h> #include <log/logger.h> #include <log/logger_support.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <process/daemon.h> #include <process/d_log.h> #include <process/d_controller.h> diff --git a/src/lib/util/Makefile.am b/src/lib/util/Makefile.am index 5db89b67d7..c7bd3214f4 100644 --- a/src/lib/util/Makefile.am +++ b/src/lib/util/Makefile.am @@ -40,12 +40,7 @@ libkea_util_la_SOURCES += unlock_guard.h libkea_util_la_SOURCES += versioned_csv_file.h versioned_csv_file.cc libkea_util_la_SOURCES += watch_socket.cc watch_socket.h libkea_util_la_SOURCES += watched_thread.cc watched_thread.h -libkea_util_la_SOURCES += encode/base16_from_binary.h -libkea_util_la_SOURCES += encode/base32hex.h encode/base64.h -libkea_util_la_SOURCES += encode/base32hex_from_binary.h -libkea_util_la_SOURCES += encode/base_n.cc encode/hex.h -libkea_util_la_SOURCES += encode/binary_from_base32hex.h -libkea_util_la_SOURCES += encode/binary_from_base16.h +libkea_util_la_SOURCES += encode/encode.cc encode/encode.h libkea_util_la_SOURCES += encode/utf8.cc encode/utf8.h libkea_util_la_LIBADD = $(top_builddir)/src/lib/exceptions/libkea-exceptions.la @@ -94,13 +89,7 @@ libkea_util_include_HEADERS = \ libkea_util_encode_includedir = $(pkgincludedir)/util/encode libkea_util_encode_include_HEADERS = \ - encode/base16_from_binary.h \ - encode/base32hex.h \ - encode/base32hex_from_binary.h \ - encode/base64.h \ - encode/binary_from_base16.h \ - encode/binary_from_base32hex.h \ - encode/hex.h \ + encode/encode.h \ encode/utf8.h libkea_util_io_includedir = $(pkgincludedir)/util/io diff --git a/src/lib/util/encode/base16_from_binary.h b/src/lib/util/encode/base16_from_binary.h deleted file mode 100644 index 3eb697dcc3..0000000000 --- a/src/lib/util/encode/base16_from_binary.h +++ /dev/null @@ -1,103 +0,0 @@ -#ifndef BOOST_ARCHIVE_ITERATORS_BASE16_FROM_BINARY_HPP -#define BOOST_ARCHIVE_ITERATORS_BASE16_FROM_BINARY_HPP - -/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 -// base16_from_binary.h (derived from boost base64_from_binary.hpp) - -// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . -// Use, modification and distribution is subject to 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) - -// See http://www.boost.org for updates, documentation, and revision history. - -#include <exceptions/isc_assert.h> - -#include <cstddef> // size_t -#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME -#if defined(BOOST_NO_STDC_NAMESPACE) -namespace std{ - using ::size_t; -} // namespace std -#endif - -// See base32hex_from_binary.h for why we need base64_from...hpp here. -#include <boost/archive/iterators/base64_from_binary.hpp> - -namespace boost { -namespace archive { -namespace iterators { - -/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 -// convert binary integers to base16 characters - -namespace detail { - -template<class CharType> -struct from_4_bit { - typedef CharType result_type; - CharType operator()(CharType t) const{ - const char * lookup_table = - "0123456789" - "ABCDEF"; - isc_throw_assert(t < 16); - return (lookup_table[static_cast<size_t>(t)]); - } -}; - -} // namespace detail - -// note: what we would like to do is -// template<class Base, class CharType = BOOST_DEDUCED_TYPENAME Base::value_type> -// typedef transform_iterator< -// from_4_bit<CharType>, -// transform_width<Base, 4, sizeof(Base::value_type) * 8, CharType> -// > base16_from_binary; -// but C++ won't accept this. Rather than using a "type generator" and -// using a different syntax, make a derivation which should be equivalent. -// -// Another issue addressed here is that the transform_iterator doesn't have -// a templated constructor. This makes it incompatible with the dataflow -// ideal. This is also addressed here. - -//template<class Base, class CharType = BOOST_DEDUCED_TYPENAME Base::value_type> -template< - class Base, - class CharType = BOOST_DEDUCED_TYPENAME boost::iterator_value<Base>::type -> -class base16_from_binary : - public transform_iterator< - detail::from_4_bit<CharType>, - Base - > -{ - friend class boost::iterator_core_access; - typedef transform_iterator< - BOOST_DEDUCED_TYPENAME detail::from_4_bit<CharType>, - Base - > super_t; - -public: - // make composable by using templated constructor - template<class T> - base16_from_binary(T start) : - super_t( - Base(static_cast<T>(start)), - detail::from_4_bit<CharType>() - ) - {} - // intel 7.1 doesn't like default copy constructor - base16_from_binary(const base16_from_binary & rhs) : - super_t( - Base(rhs.base_reference()), - detail::from_4_bit<CharType>() - ) - {} -// base16_from_binary(){}; -}; - -} // namespace iterators -} // namespace archive -} // namespace boost - -#endif // BOOST_ARCHIVE_ITERATORS_BASE16_FROM_BINARY_HPP diff --git a/src/lib/util/encode/base32hex.h b/src/lib/util/encode/base32hex.h deleted file mode 100644 index 0a85b360d5..0000000000 --- a/src/lib/util/encode/base32hex.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (C) 2009-2015 Internet Systems Consortium, Inc. ("ISC") -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef BASE32HEX_H -#define BASE32HEX_H 1 - -#include <stdint.h> -#include <string> -#include <vector> - -// -// Note: this helper module isn't specific to the DNS protocol per se. -// We should probably move this to somewhere else, possibly in some common -// utility area. -// - -namespace isc { -namespace util { -namespace encode { - -/// \brief Encode binary data in the base32hex format. -/// -/// The underlying implementation is shared with \c encodeBase64, and all -/// description except the format (base32hex) equally applies. -/// -/// Note: the encoding format is base32hex, not base32. -/// -/// \param binary A vector object storing the data to be encoded. -/// \return A newly created string that stores base32hex encoded value for -/// binary. -std::string encodeBase32Hex(const std::vector<uint8_t>& binary); - -/// \brief Decode a text encoded in the base32hex format into the -/// original %data. -/// -/// The underlying implementation is shared with \c decodeBase64, and all -/// description except the format (base32hex) equally applies. -/// -/// Note: the encoding format is base32hex, not base32. -/// -/// \param input A text encoded in the base32hex format. -/// \param result A vector in which the decoded %data is to be stored. -void decodeBase32Hex(const std::string& input, std::vector<uint8_t>& result); - -} // namespace encode -} // namespace util -} // namespace isc - -#endif // BASE32HEX_H - -// Local Variables: -// mode: c++ -// End: diff --git a/src/lib/util/encode/base32hex_from_binary.h b/src/lib/util/encode/base32hex_from_binary.h deleted file mode 100644 index 84f2b69b3f..0000000000 --- a/src/lib/util/encode/base32hex_from_binary.h +++ /dev/null @@ -1,105 +0,0 @@ -#ifndef BOOST_ARCHIVE_ITERATORS_BASE32HEX_FROM_BINARY_HPP -#define BOOST_ARCHIVE_ITERATORS_BASE32HEX_FROM_BINARY_HPP - -/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 -// base32hex_from_binary.h (derived from boost base64_from_binary.hpp) - -// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . -// Use, modification and distribution is subject to 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) - -// See http://www.boost.org for updates, documentation, and revision history. - -#include <exceptions/isc_assert.h> - -#include <cstddef> // size_t -#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME -#if defined(BOOST_NO_STDC_NAMESPACE) -namespace std{ - using ::size_t; -} // namespace std -#endif - -// We use the same boost header files used in "base64_from_". Since the -// precise path to these headers may vary depending on the boost version we -// simply include the base64 header here. -#include <boost/archive/iterators/base64_from_binary.hpp> - -namespace boost { -namespace archive { -namespace iterators { - -/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 -// convert binary integers to base32hex characters - -namespace detail { - -template<class CharType> -struct from_5_bit { - typedef CharType result_type; - CharType operator()(CharType t) const{ - const char * lookup_table = - "0123456789" - "ABCDEFGHIJKLMNOPQRSTUV"; - isc_throw_assert(t < 32); - return (lookup_table[static_cast<size_t>(t)]); - } -}; - -} // namespace detail - -// note: what we would like to do is -// template<class Base, class CharType = BOOST_DEDUCED_TYPENAME Base::value_type> -// typedef transform_iterator< -// from_5_bit<CharType>, -// transform_width<Base, 5, sizeof(Base::value_type) * 8, CharType> -// > base32hex_from_binary; -// but C++ won't accept this. Rather than using a "type generator" and -// using a different syntax, make a derivation which should be equivalent. -// -// Another issue addressed here is that the transform_iterator doesn't have -// a templated constructor. This makes it incompatible with the dataflow -// ideal. This is also addressed here. - -//template<class Base, class CharType = BOOST_DEDUCED_TYPENAME Base::value_type> -template< - class Base, - class CharType = BOOST_DEDUCED_TYPENAME boost::iterator_value<Base>::type -> -class base32hex_from_binary : - public transform_iterator< - detail::from_5_bit<CharType>, - Base - > -{ - friend class boost::iterator_core_access; - typedef transform_iterator< - BOOST_DEDUCED_TYPENAME detail::from_5_bit<CharType>, - Base - > super_t; - -public: - // make composable by using templated constructor - template<class T> - base32hex_from_binary(T start) : - super_t( - Base(static_cast<T>(start)), - detail::from_5_bit<CharType>() - ) - {} - // intel 7.1 doesn't like default copy constructor - base32hex_from_binary(const base32hex_from_binary & rhs) : - super_t( - Base(rhs.base_reference()), - detail::from_5_bit<CharType>() - ) - {} -// base32hex_from_binary(){}; -}; - -} // namespace iterators -} // namespace archive -} // namespace boost - -#endif // BOOST_ARCHIVE_ITERATORS_BASE32HEX_FROM_BINARY_HPP diff --git a/src/lib/util/encode/base64.h b/src/lib/util/encode/base64.h deleted file mode 100644 index 84280ecb15..0000000000 --- a/src/lib/util/encode/base64.h +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (C) 2009-2015 Internet Systems Consortium, Inc. ("ISC") -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef BASE64_H -#define BASE64_H 1 - -#include <stdint.h> -#include <string> -#include <vector> - -// -// Note: this helper module isn't specific to the DNS protocol per se. -// We should probably move this to somewhere else, possibly in some common -// utility area. -// - -namespace isc { -namespace util { -namespace encode { - -/// \brief Encode binary data in the base64 format. -/// -/// This function returns a new \c std::string object that stores a text -/// encoded in the base64 format for the given \c binary %data. -/// The resulting string will be a valid, canonical form of base64 -/// representation as specified in RFC4648. -/// -/// If memory allocation for the returned string fails, a corresponding -/// standard exception will be thrown. This function never throws exceptions -/// otherwise. -/// -/// \param binary A vector object storing the data to be encoded. -/// \return A newly created string that stores base64 encoded value for binary. -std::string encodeBase64(const std::vector<uint8_t>& binary); - -/// \brief Decode a text encoded in the base64 format into the original %data. -/// -/// The \c input argument must be a valid string represented in the base64 -/// format as specified in RFC4648. Space characters (spaces, tabs, newlines) -/// can be included in \c input and will be ignored. Without spaces, the -/// length of string must be a multiple of 4 bytes with necessary paddings. -/// Also it must be encoded using the canonical encoding (see RFC4648). -/// If any of these conditions is not met, an exception of class -/// \c isc::BadValue will be thrown. -/// -/// If \c result doesn't have sufficient capacity to store all decoded %data -/// and memory allocation fails, a corresponding standard exception will be -/// thrown. If the caller knows the necessary length (which can in theory -/// be calculated from the input string), this situation can be avoided by -/// reserving sufficient space for \c result beforehand. -/// -/// Any existing %data in \c result will be removed. This is the case in some -/// of the cases where an exception is thrown; that is, this function only -/// provides the basic exception guarantee. -/// -/// \param input A text encoded in the base64 format. -/// \param result A vector in which the decoded %data is to be stored. -void decodeBase64(const std::string& input, std::vector<uint8_t>& result); - -} // namespace encode -} // namespace util -} // namespace isc - -#endif // BASE64_H - -// Local Variables: -// mode: c++ -// End: diff --git a/src/lib/util/encode/base_n.cc b/src/lib/util/encode/base_n.cc deleted file mode 100644 index e0c37e5f49..0000000000 --- a/src/lib/util/encode/base_n.cc +++ /dev/null @@ -1,494 +0,0 @@ -// Copyright (C) 2010-2022 Internet Systems Consortium, Inc. ("ISC") -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include <config.h> - -#include <util/encode/base32hex_from_binary.h> -#include <util/encode/binary_from_base32hex.h> -#include <util/encode/base16_from_binary.h> -#include <util/encode/binary_from_base16.h> -#include <util/encode/base32hex.h> -#include <util/encode/base64.h> - -#include <exceptions/exceptions.h> -#include <exceptions/isc_assert.h> - -#include <boost/archive/iterators/base64_from_binary.hpp> -#include <boost/archive/iterators/binary_from_base64.hpp> -#include <boost/archive/iterators/transform_width.hpp> -#ifdef HAVE_BOOST_INTEGER_COMMON_FACTOR_HPP -#include <boost/integer/common_factor.hpp> -#else -#include <boost/math/common_factor.hpp> -#endif - -#include <stdint.h> -#include <stdexcept> -#include <iterator> -#include <string> -#include <vector> - -using namespace std; -using namespace boost::archive::iterators; - -namespace isc { -namespace util { -namespace encode { - -// Some versions of clang cannot handle exceptions in unnamed namespaces -// so this exception is defined in an 'internal' namespace -namespace clang_unnamed_namespace_workaround { -// An internally caught exception to unify a few possible cases of the same -// error. -class IncompleteBaseInput : public std::exception { -}; -} // end namespace internal - -// In the following anonymous namespace, we provide a generic framework -// to encode/decode baseN format. We use the following tools: -// - boost base64_from_binary/binary_from_base64: provide mapping table for -// base64. -// These classes take another iterator (Base) as a template argument, and -// their dereference operator (operator*()) first retrieves an input value -// from Base via Base::operator* and converts the value using their mapping -// table. The converted value is returned as their own operator*. -// - base{32hex,16}_from_binary/binary_from_base{32hex,16}: provide mapping -// table for base32hex and base16. A straightforward variation of their -// base64 counterparts. -// - EncodeNormalizer/DecodeNormalizer: supplemental filter handling baseN -// padding characters (=) -// - boost transform_width: an iterator framework for handling data stream -// per bit-group. It takes another iterator (Base) and output/input bit -// numbers (BitsOut/BitsIn) template arguments. A transform_width object -// internally maintains a bit stream, which can be retrieved per BitsOut -// bits via its dereference operator (operator*()). It builds the stream -// by internally iterating over the Base object via Base::operator++ and -// Base::operator*, using the least BitsIn bits of the result of -// Base::operator*. In our usage BitsIn for encoding and BitsOut for -// decoding are always 8 (# of bits for one byte). -// -// Its dereference operator -// retrieves BitsIn bits from the result of "*Base" (if necessary it -// internally calls ++Base) -// -// A conceptual description of how the encoding and decoding work is as -// follows: -// Encoding: -// input binary data => Normalizer (append sufficient number of 0 bits) -// => transform_width (extract bit groups from the original -// stream) -// => baseXX_from_binary (convert each bit group to an -// encoded byte using the mapping) -// Decoding: -// input baseXX text => Normalizer (convert '='s to the encoded characters -// corresponding to 0, e.g. 'A's in base64) -// => binary_from_baseXX (convert each encoded byte into -// the original group bit) -// => transform_width (build original byte stream by -// concatenating the decoded bit -// stream) -// -// Below, we define a set of templated classes to handle different parameters -// for different encoding algorithms. -namespace { -// Common constants used for all baseN encoding. -const char BASE_PADDING_CHAR = '='; -const uint8_t BINARY_ZERO_CODE = 0; - -// EncodeNormalizer is an input iterator intended to be used as a filter -// between the binary stream and baseXX_from_binary translator (via -// transform_width). An EncodeNormalizer object is configured with two -// iterators (base and base_end), specifying the head and end of the input -// stream. It internally iterators over the original stream, and return -// each byte of the stream intact via its dereference operator until it -// reaches the end of the stream. After that the EncodeNormalizer object -// will return 0 no matter how many times it is subsequently incremented. -// This is necessary because the input binary stream may not contain -// sufficient bits for a full encoded text while baseXX_from_binary expects -// a sufficient length of input. -// Note: this class is intended to be used within this implementation file, -// and assumes "base < base_end" on construction without validating the -// arguments. The behavior is undefined if this assumption doesn't hold. -class EncodeNormalizer { -public: - // Aliases used to enable iterator behavior on this class - using iterator_category = input_iterator_tag; - using value_type = uint8_t; - using difference_type = ptrdiff_t; - using pointer = uint8_t*; - using reference = uint8_t&; - - EncodeNormalizer(const vector<uint8_t>::const_iterator& base, - const vector<uint8_t>::const_iterator& base_end) : - base_(base), base_end_(base_end), in_pad_(false) - {} - EncodeNormalizer& operator++() { // prefix version - increment(); - return (*this); - } - EncodeNormalizer operator++(int) { // postfix version - const EncodeNormalizer copy = *this; - increment(); - return (copy); - } - const uint8_t& operator*() const { - if (in_pad_) { - return (BINARY_ZERO_CODE); - } else { - return (*base_); - } - } - bool operator==(const EncodeNormalizer& other) const { - return (base_ == other.base_); - } -private: - void increment() { - if (!in_pad_) { - ++base_; - } - if (base_ == base_end_) { - in_pad_ = true; - } - } - vector<uint8_t>::const_iterator base_; - const vector<uint8_t>::const_iterator base_end_; - bool in_pad_; -}; - -// DecodeNormalizer is an input iterator intended to be used as a filter -// between the encoded baseX stream and binary_from_baseXX. -// A DecodeNormalizer object is configured with three string iterators -// (base, base_beginpad, and base_end), specifying the head of the string, -// the beginning position of baseX padding (when there's padding), and -// end of the string, respectively. It internally iterators over the original -// stream, and return each character of the encoded string via its dereference -// operator until it reaches base_beginpad. After that the DecodeNormalizer -// will return the encoding character corresponding to the all-0 value -// (which is specified on construction via base_zero_code. see also -// BaseZeroCode below). This translation is necessary because -// binary_from_baseXX doesn't accept the padding character (i.e. '='). -// Note: this class is intended to be used within this implementation file, -// and for simplicity assumes "base < base_beginpad <= base_end" on -// construction without validating the arguments. The behavior is undefined -// if this assumption doesn't hold. -class DecodeNormalizer { -public: - // Aliases used to enable iterator behavior on this class - using iterator_category = input_iterator_tag; - using value_type = char; - using difference_type = ptrdiff_t; - using pointer = char*; - using reference = char&; - - DecodeNormalizer(const char base_zero_code, - const string::const_iterator& base, - const string::const_iterator& base_beginpad, - const string::const_iterator& base_end, - size_t* char_count) : - base_zero_code_(base_zero_code), - base_(base), base_beginpad_(base_beginpad), base_end_(base_end), - in_pad_(false), char_count_(char_count) - { - // Skip beginning spaces, if any. We need do it here because - // otherwise the first call to operator*() would be confused. - skipSpaces(); - } - DecodeNormalizer& operator++() { - if (base_ < base_end_) { - ++*char_count_; - } - ++base_; - skipSpaces(); - if (base_ == base_beginpad_) { - in_pad_ = true; - } - return (*this); - } - void skipSpaces() { - // If (char is signed and) *base_ < 0, on Windows platform with Visual - // Studio compiler it may trigger _ASSERTE((unsigned)(c + 1) <= 256); - // so make sure that the parameter of isspace() is larger than 0. - // We don't simply cast it to unsigned char to avoid confusing the - // isspace() implementation with a possible extension for values - // larger than 127. Also note the check is not ">= 0"; for systems - // where char is unsigned that would always be true and would possibly - // trigger a compiler warning that could stop the build. - while (base_ != base_end_ && *base_ > 0 && isspace(*base_)) { - ++base_; - } - } - const char& operator*() const { - if (base_ == base_end_) { - // binary_from_baseX can call this operator when it needs more bits - // even if the internal iterator (base_) has reached its end - // (if that happens it means the input is an incomplete baseX - // string and should be rejected). So this is the only point - // we can catch and reject this type of invalid input. - // - // More recent versions of Boost fixed the behavior and the - // out-of-range call to this operator doesn't happen. It's good, - // but in that case we need to catch incomplete baseX input in - // a different way. It's done via char_count_ and after the - // completion of decoding. - - // throw this now and convert it - throw clang_unnamed_namespace_workaround::IncompleteBaseInput(); - } - if (*base_ == BASE_PADDING_CHAR) { - // Padding can only happen at the end of the input string. We can - // detect any violation of this by checking in_pad_, which is - // true iff we are on or after the first valid sequence of padding - // characters. - if (in_pad_) { - return (base_zero_code_); - } else { - isc_throw(BadValue, "Intermediate padding found"); - } - } else { - return (*base_); - } - } - bool operator==(const DecodeNormalizer& other) const { - return (base_ == other.base_); - } -private: - const char base_zero_code_; - string::const_iterator base_; - const string::const_iterator base_beginpad_; - const string::const_iterator base_end_; - bool in_pad_; - // Store number of non-space decoded characters (incl. pad) here. Define - // it as a pointer so we can carry it over to any copied objects. - size_t* char_count_; -}; - -// BitsPerChunk: number of bits to be converted using the baseN mapping table. -// e.g. 6 for base64. -// BaseZeroCode: the byte character that represents a value of 0 in -// the corresponding encoding. e.g. 'A' for base64. -// Encoder: baseX_from_binary<transform_width<EncodeNormalizer, -// BitsPerChunk, 8> > -// Decoder: transform_width<binary_from_baseX<DecodeNormalizer>, -// 8, BitsPerChunk> -template <int BitsPerChunk, char BaseZeroCode, - typename Encoder, typename Decoder> -struct BaseNTransformer { - static string encode(const vector<uint8_t>& binary); - static void decode(const char* algorithm, - const string& base64, vector<uint8_t>& result); - - // BITS_PER_GROUP is the number of bits for the smallest possible (non - // empty) bit string that can be converted to a valid baseN encoded text - // without padding. It's the least common multiple of 8 and BitsPerChunk, - // e.g. 24 for base64. - static const int BITS_PER_GROUP = -#ifdef HAVE_BOOST_INTEGER_COMMON_FACTOR_HPP - boost::integer::static_lcm<BitsPerChunk, 8>::value; -#else - boost::math::static_lcm<BitsPerChunk, 8>::value; -#endif - - // MAX_PADDING_CHARS is the maximum number of padding characters - // that can appear in a valid baseN encoded text. - // It's group_len - chars_for_byte, where group_len is the number of - // encoded characters to represent BITS_PER_GROUP bits, and - // chars_for_byte is the number of encoded character that is needed to - // represent a single byte, which is ceil(8 / BitsPerChunk). - // For example, for base64 we need two encoded characters to represent a - // byte, and each group consists of 4 encoded characters, so - // MAX_PADDING_CHARS is 4 - 2 = 2. - static const int MAX_PADDING_CHARS = - BITS_PER_GROUP / BitsPerChunk - - (8 / BitsPerChunk + ((8 % BitsPerChunk) == 0 ? 0 : 1)); -}; - -template <int BitsPerChunk, char BaseZeroCode, - typename Encoder, typename Decoder> -string -BaseNTransformer<BitsPerChunk, BaseZeroCode, Encoder, Decoder>::encode( - const vector<uint8_t>& binary) -{ - // calculate the resulting length. - size_t bits = binary.size() * 8; - if (bits % BITS_PER_GROUP > 0) { - bits += (BITS_PER_GROUP - (bits % BITS_PER_GROUP)); - } - const size_t len = bits / BitsPerChunk; - - string result; - result.reserve(len); - result.assign(Encoder(EncodeNormalizer(binary.begin(), binary.end())), - Encoder(EncodeNormalizer(binary.end(), binary.end()))); - isc_throw_assert(len >= result.length()); - result.append(len - result.length(), BASE_PADDING_CHAR); - return (result); -} - -template <int BitsPerChunk, char BaseZeroCode, - typename Encoder, typename Decoder> -void -BaseNTransformer<BitsPerChunk, BaseZeroCode, Encoder, Decoder>::decode( - const char* const algorithm, - const string& input, - vector<uint8_t>& result) -{ - // enumerate the number of trailing padding characters (=), ignoring - // white spaces. since baseN_from_binary doesn't accept padding, - // we handle it explicitly. - size_t padchars = 0; - string::const_reverse_iterator srit = input.rbegin(); - string::const_reverse_iterator srit_end = input.rend(); - while (srit != srit_end) { - char ch = *srit; - if (ch == BASE_PADDING_CHAR) { - if (++padchars > MAX_PADDING_CHARS) { - isc_throw(BadValue, "Too many " << algorithm - << " padding characters: " << input); - } - } else if (!(ch > 0 && isspace(ch))) { - // see the note for DecodeNormalizer::skipSpaces() above for ch > 0 - break; - } - ++srit; - } - // then calculate the number of padding bits corresponding to the padding - // characters. In general, the padding bits consist of all-zero - // trailing bits of the last encoded character followed by zero bits - // represented by the padding characters: - // 1st pad 2nd pad 3rd pad... - // +++===== ======= ===... (+: from encoded chars, =: from pad chars) - // 0000...0 0......0 000... - // 0 7 8 15 16.... (bits) - // The number of bits for the '==...' part is padchars * BitsPerChunk. - // So the total number of padding bits is the smallest multiple of 8 - // that is >= padchars * BitsPerChunk. - // (Below, note the common idiom of the bitwise AND with ~7. It clears the - // lowest three bits, so has the effect of rounding the result down to the - // nearest multiple of 8) - const size_t padbits = (padchars * BitsPerChunk + 7) & ~7; - - // In some encoding algorithm, it could happen that a padding byte would - // contain a full set of encoded bits, which is not allowed by definition - // of padding. For example, if BitsPerChunk is 5, the following - // representation could happen: - // ++00000= (+: from encoded chars, 0: encoded char for '0', =: pad chars) - // 0 7 (bits) - // This must actually be encoded as follows: - // ++====== - // 0 7 (bits) - // The following check rejects this type of invalid encoding. - if (padbits > BitsPerChunk * (padchars + 1)) { - isc_throw(BadValue, "Invalid " << algorithm << " padding: " << input); - } - - // convert the number of bits in bytes for convenience. - const size_t padbytes = padbits / 8; - - try { - size_t char_count = 0; - result.assign(Decoder(DecodeNormalizer(BaseZeroCode, input.begin(), - srit.base(), input.end(), - &char_count)), - Decoder(DecodeNormalizer(BaseZeroCode, input.end(), - input.end(), input.end(), - NULL))); - - // Number of bits of the conversion result including padding must be - // a multiple of 8; otherwise the decoder reaches the end of input - // with some incomplete bits of data, which is invalid. - if (((char_count * BitsPerChunk) % 8) != 0) { - // catch this immediately below - throw clang_unnamed_namespace_workaround::IncompleteBaseInput(); - } - } catch (const clang_unnamed_namespace_workaround::IncompleteBaseInput&) { - // we unify error handling for incomplete input here. - isc_throw(BadValue, "Incomplete input for " << algorithm - << ": " << input); - } catch (const dataflow_exception& ex) { - // convert any boost exceptions into our local one. - isc_throw(BadValue, ex.what()); - } - - // Confirm the original BaseX text is the canonical encoding of the - // data, that is, that the first byte of padding is indeed 0. - // (DecodeNormalizer and binary_from_baseXX ensure that the rest of the - // padding is all zero). - isc_throw_assert(result.size() >= padbytes); - if (padbytes > 0 && *(result.end() - padbytes) != 0) { - isc_throw(BadValue, "Non 0 bits included in " << algorithm - << " padding: " << input); - } - - // strip the padded zero-bit fields - result.resize(result.size() - padbytes); -} - -// -// Instantiation for BASE-64 -// -typedef -base64_from_binary<transform_width<EncodeNormalizer, 6, 8> > base64_encoder; -typedef -transform_width<binary_from_base64<DecodeNormalizer>, 8, 6> base64_decoder; -typedef BaseNTransformer<6, 'A', base64_encoder, base64_decoder> -Base64Transformer; - -// -// Instantiation for BASE-32HEX -// -typedef -base32hex_from_binary<transform_width<EncodeNormalizer, 5, 8> > -base32hex_encoder; -typedef -transform_width<binary_from_base32hex<DecodeNormalizer>, 8, 5> -base32hex_decoder; -typedef BaseNTransformer<5, '0', base32hex_encoder, base32hex_decoder> -Base32HexTransformer; - -// -// Instantiation for BASE-16 (HEX) -// -typedef -base16_from_binary<transform_width<EncodeNormalizer, 4, 8> > base16_encoder; -typedef -transform_width<binary_from_base16<DecodeNormalizer>, 8, 4> base16_decoder; -typedef BaseNTransformer<4, '0', base16_encoder, base16_decoder> -Base16Transformer; -} - -string -encodeBase64(const vector<uint8_t>& binary) { - return (Base64Transformer::encode(binary)); -} - -void -decodeBase64(const string& input, vector<uint8_t>& result) { - Base64Transformer::decode("base64", input, result); -} - -string -encodeBase32Hex(const vector<uint8_t>& binary) { - return (Base32HexTransformer::encode(binary)); -} - -void -decodeBase32Hex(const string& input, vector<uint8_t>& result) { - Base32HexTransformer::decode("base32hex", input, result); -} - -string -encodeHex(const vector<uint8_t>& binary) { - return (Base16Transformer::encode(binary)); -} - -void -decodeHex(const string& input, vector<uint8_t>& result) { - Base16Transformer::decode("base16", input, result); -} - -} // namespace encode -} // namespace util -} // namespace isc diff --git a/src/lib/util/encode/binary_from_base16.h b/src/lib/util/encode/binary_from_base16.h deleted file mode 100644 index f913dd0722..0000000000 --- a/src/lib/util/encode/binary_from_base16.h +++ /dev/null @@ -1,112 +0,0 @@ -#ifndef BOOST_ARCHIVE_ITERATORS_BINARY_FROM_BASE16_HPP -#define BOOST_ARCHIVE_ITERATORS_BINARY_FROM_BASE16_HPP - -/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 -// binary_from_base16.h (derived from boost binary_from_base64.hpp) - -// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . -// Use, modification and distribution is subject to 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) - -// See http://www.boost.org for updates, documentation, and revision history. - -#include <cassert> - -// See binary_from_base32hex.h for why we need _from_base64.hpp here. -#include <boost/archive/iterators/binary_from_base64.hpp> - -#include <exceptions/exceptions.h> - -namespace boost { -namespace archive { -namespace iterators { - -/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 -// convert base16 characters to binary data - -namespace detail { - -template<class CharType> -struct to_4_bit { - typedef CharType result_type; - CharType operator()(CharType t) const{ - const signed char lookup_table[] = { - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 00-0f - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 10-1f - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 20-2f - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1, // 30-3f - -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 40-4f - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 50-5f - -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 // 60-6f - }; - BOOST_STATIC_ASSERT(0x70 == sizeof(lookup_table)); - signed char value = -1; - if((unsigned)t < sizeof(lookup_table)) - value = lookup_table[(unsigned)t]; - if(-1 == value) { - isc_throw(isc::BadValue, - "attempt to decode a value not in base16 char set"); - } - return (value); - } -}; - -} // namespace detail - -// note: what we would like to do is -// template<class Base, class CharType = BOOST_DEDUCED_TYPENAME Base::value_type> -// typedef transform_iterator< -// from_4_bit<CharType>, -// transform_width<Base, 4, sizeof(Base::value_type) * 8, CharType> -// > base16_from_binary; -// but C++ won't accept this. Rather than using a "type generator" and -// using a different syntax, make a derivation which should be equivalent. -// -// Another issue addressed here is that the transform_iterator doesn't have -// a templated constructor. This makes it incompatible with the dataflow -// ideal. This is also addressed here. - -template< - class Base, - class CharType = BOOST_DEDUCED_TYPENAME boost::iterator_value<Base>::type -> -class binary_from_base16 : public - transform_iterator< - detail::to_4_bit<CharType>, - Base - > -{ - friend class boost::iterator_core_access; - typedef transform_iterator< - detail::to_4_bit<CharType>, - Base - > super_t; -public: - // make composable by using templated constructor - template<class T> - binary_from_base16(T start) : - super_t( - Base(static_cast<T>(start)), - detail::to_4_bit<CharType>() - ) - {} - // intel 7.1 doesn't like default copy constructor - binary_from_base16(const binary_from_base16 & rhs) : - super_t( - Base(rhs.base_reference()), - detail::to_4_bit<CharType>() - ) - {} -// binary_from_base16(){}; -}; - -} // namespace iterators -} // namespace archive -} // namespace boost - -#endif // BOOST_ARCHIVE_ITERATORS_BINARY_FROM_BASE16_HPP - -// Local Variables: -// mode: c++ -// End: diff --git a/src/lib/util/encode/binary_from_base32hex.h b/src/lib/util/encode/binary_from_base32hex.h deleted file mode 100644 index 2911789cd3..0000000000 --- a/src/lib/util/encode/binary_from_base32hex.h +++ /dev/null @@ -1,115 +0,0 @@ -#ifndef BOOST_ARCHIVE_ITERATORS_BINARY_FROM_BASE32HEX_HPP -#define BOOST_ARCHIVE_ITERATORS_BINARY_FROM_BASE32HEX_HPP - -/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 -// binary_from_base32hex.h (derived from boost binary_from_base64.hpp) - -// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . -// Use, modification and distribution is subject to 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) - -// See http://www.boost.org for updates, documentation, and revision history. - -#include <cassert> - -// We use the same boost header files used in "_from_base64". Since the -// precise path to these headers may vary depending on the boost version we -// simply include the base64 header here. -#include <boost/archive/iterators/binary_from_base64.hpp> - -#include <exceptions/exceptions.h> - -namespace boost { -namespace archive { -namespace iterators { - -/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 -// convert base32hex characters to binary data - -namespace detail { - -template<class CharType> -struct to_5_bit { - typedef CharType result_type; - CharType operator()(CharType t) const{ - const signed char lookup_table[] = { - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 00-0f - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 10-1f - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 20-2f - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1, // 30-3f - -1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, // 40-4f - 25,26,27,28,29,30,31,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 50-5f - -1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, // 60-6f - 25,26,27,28,29,30,31,-1,-1,-1,-1,-1,-1,-1,-1,-1 // 70-7f - }; - BOOST_STATIC_ASSERT(0x80 == sizeof(lookup_table)); - signed char value = -1; - if((unsigned)t < sizeof(lookup_table)) - value = lookup_table[(unsigned)t]; - if(-1 == value) { - isc_throw(isc::BadValue, - "attempt to decode a value not in base32hex char set"); - } - return (value); - } -}; - -} // namespace detail - -// note: what we would like to do is -// template<class Base, class CharType = BOOST_DEDUCED_TYPENAME Base::value_type> -// typedef transform_iterator< -// from_5_bit<CharType>, -// transform_width<Base, 5, sizeof(Base::value_type) * 8, CharType> -// > base32hex_from_binary; -// but C++ won't accept this. Rather than using a "type generator" and -// using a different syntax, make a derivation which should be equivalent. -// -// Another issue addressed here is that the transform_iterator doesn't have -// a templated constructor. This makes it incompatible with the dataflow -// ideal. This is also addressed here. - -template< - class Base, - class CharType = BOOST_DEDUCED_TYPENAME boost::iterator_value<Base>::type -> -class binary_from_base32hex : public - transform_iterator< - detail::to_5_bit<CharType>, - Base - > -{ - friend class boost::iterator_core_access; - typedef transform_iterator< - detail::to_5_bit<CharType>, - Base - > super_t; -public: - // make composable by using templated constructor - template<class T> - binary_from_base32hex(T start) : - super_t( - Base(static_cast<T>(start)), - detail::to_5_bit<CharType>() - ) - {} - // intel 7.1 doesn't like default copy constructor - binary_from_base32hex(const binary_from_base32hex & rhs) : - super_t( - Base(rhs.base_reference()), - detail::to_5_bit<CharType>() - ) - {} -// binary_from_base32hex(){}; -}; - -} // namespace iterators -} // namespace archive -} // namespace boost - -#endif // BOOST_ARCHIVE_ITERATORS_BINARY_FROM_BASE32HEX_HPP - -// Local Variables: -// mode: c++ -// End: diff --git a/src/lib/util/encode/encode.cc b/src/lib/util/encode/encode.cc new file mode 100644 index 0000000000..52b15e6907 --- /dev/null +++ b/src/lib/util/encode/encode.cc @@ -0,0 +1,280 @@ +// Copyright (C) 2024 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include <config.h> + +#include <exceptions/exceptions.h> +#include <exceptions/isc_assert.h> +#include <util/encode/encode.h> + +#include <iostream> +#include <stdint.h> +#include <stdexcept> +#include <string> +#include <vector> + +using namespace std; + +namespace isc { +namespace util { +namespace encode { + +std::string +encodeBaseN(const std::vector<uint8_t>& input, const char* digit_set, size_t bits_per_digit, + size_t digits_per_group, const char pad_char) { + std::string encoded_output; + if (input.empty()) { + return(encoded_output); + } + + // Turn the input data into a "bit stream" + /// @todo Can we devize a bit-stream class that can iterate over the input + /// without copying it? The weakness here is inbits could be rather large + /// for long strings since it input size * 8 bytes. + bool inbits[input.size() * 8]; + bool* inbit = &inbits[0]; + for (auto b : input) { + for (auto i = 0; i < 8; i++) { + bool val = b & 0x80; + *inbit++ = val; + b <<= 1; + } + } + + // Now encode the bit stream. + int cnt = 0; + int digit_idx = 0; + auto inbit_end = inbit; + inbit = &inbits[0]; + for (inbit = &inbits[0]; inbit != inbit_end; ++inbit) { + if (cnt < bits_per_digit) { + // Shift the index one to accomodate next bit. + digit_idx <<= 1; + } else { + // Have a complete digit index, look it the digit and add it. + encoded_output.push_back(digit_set[digit_idx]); + digit_idx = 0; + cnt = 0; + } + + // Add the current bit to the digit index. + digit_idx |= *inbit; + ++cnt; + } + + // We've exhausted bits, but have left over + if (cnt) { + digit_idx <<= (bits_per_digit - cnt); + encoded_output.push_back(digit_set[digit_idx]); + } + + // Add padding as needed. + if (digits_per_group) { + auto rem = encoded_output.size() % digits_per_group; + if (rem) { + auto need = digits_per_group - rem + 1; + while (--need) { + encoded_output.push_back(pad_char); + } + } + } + + return(encoded_output); +} + +void +decodeBaseN(const std::string& algorithm, + const std::string& encoded_str, std::vector<uint8_t>& output, + const uint8_t* lookup_table, + size_t bits_per_digit, + size_t digits_per_group, + const char pad_char, + size_t max_pad) { + + output.clear(); + bool inbits[encoded_str.size() * bits_per_digit]; + bool* inbit = &inbits[0]; + size_t dig_cnt = 0; + size_t pad_cnt = 0; + size_t shift_bits = 8 - bits_per_digit; + for (const auto enc_digit : encoded_str) { + if (pad_char && enc_digit == pad_char) { + pad_cnt++; + continue; + } + + // translate the b64 digit to bits. + uint8_t dig_bits = lookup_table[static_cast<uint8_t>(enc_digit)]; + + if (dig_bits == 0xee) { + // skip whitespace + continue; + } + + if (dig_bits == 0xff) { + isc_throw(isc::BadValue, "attempt to decode a value not in " + << algorithm << " char set" << ": " << encoded_str); + } + + if (pad_cnt) { + isc_throw(isc::BadValue, "pad mixed with digits in " + << algorithm << ": " << encoded_str); + } + + dig_cnt++; + dig_bits <<= shift_bits; + for (auto i = 0; i < bits_per_digit; ++i) { + *inbit++ = ((dig_bits & 0x80) == 0x80); + dig_bits <<= 1; + } + } + + if (pad_char) { + // Check for invalid number of pad characters. + if (pad_cnt > max_pad) { + isc_throw(isc::BadValue, "too many pad characters for " + << algorithm << ": " << encoded_str); + } + + // Check for invalid number of pad characters. + /// @todo is this valid + const size_t padbits = ((pad_cnt * bits_per_digit) + 7) & ~7; + if (padbits > bits_per_digit * (pad_cnt + 1)) { + isc_throw(isc::BadValue, "Invalid padding for " + << algorithm << ": " << encoded_str); + } + } + + // Check for an invalid total of encoded characters. + if ((pad_cnt + dig_cnt) % digits_per_group) { + isc_throw (isc::BadValue, "Incomplete input for " + << algorithm << ": " << encoded_str); + } + + int cnt = 0; + int digit_idx = 0; + + auto inbit_end = inbit; + inbit = &inbits[0]; + for (inbit = &inbits[0]; inbit != inbit_end; ++inbit) { + if (cnt < 8) { + digit_idx <<= 1; + } else { + output.push_back(digit_idx); + digit_idx = 0; + cnt = 0; + } + + digit_idx |= *inbit; + ++cnt; + } + + if (cnt == 8) { + // Whole one left to add. + output.push_back(digit_idx); + } else if (cnt && digit_idx) { + // Left over bits that are not zero. + isc_throw(BadValue, "non-zero bits left over " << encoded_str); + } +} + + +string +encodeBase64(const vector<uint8_t>& binary) { + static char B64_DIG[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+/"; + return(encodeBaseN(binary, B64_DIG, 6, 4, '=')); +} + +void +decodeBase64 (const std::string& encoded_str, std::vector<uint8_t>& output) { + static const uint8_t lookup_table[] = { + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xee,0xee,0xee,0xee,0xee,0xff,0xff, // 00-0f + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 10-1f + 0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,62,0xff,0xff,0xff,63, // 20-2f + 52,53,54,55,56,57,58,59,60,61,0xff,0xff,0xff, 0,0xff,0xff, // 30-3f + 0xff, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14, // 40-4f + 15,16,17,18,19,20,21,22,23,24,25,0xff,0xff,0xff,0xff,0xff, // 50-5f + 0xff,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, // 60-6f + 41,42,43,44,45,46,47,48,49,50,51,0xff,0xff,0xff,0xff,0xff, // 70-7f + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 80-8f + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 90-9f + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // a0-af + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // b0-bf + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // c0-cf + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // d0-df + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // e0-ef + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff // f0-ff + }; + + decodeBaseN("base64", encoded_str, output, lookup_table, 6, 4, '=', 2); +} + +string +encodeBase32Hex(const vector<uint8_t>& binary) { + static char B32_DIG[] = "0123456789ABCDEFGHIJKLMNOPQRSTUV"; + return(encodeBaseN(binary, B32_DIG, 5, 8, '=')); +} + +void +decodeBase32Hex(const std::string& encoded_str, std::vector<uint8_t>& output) { + static const uint8_t lookup_table[] = { + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xee,0xee,0xee,0xee,0xee,0xff,0xff, // 00-0f + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 10-1f + 0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 20-2f + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,0xff,0xff,0xff,0xff,0xff,0xff, // 30-3f + 0xff,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, // 40-4f + 25,26,27,28,29,30,31,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 50-5f + 0xff,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, // 60-6f + 25,26,27,28,29,30,31,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 70-7f + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 80-8f + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 90-9f + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // a0-af + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // b0-bf + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // c0-cf + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // d0-df + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // e0-ef + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff // f0-ff + }; + + decodeBaseN("base32hex", encoded_str, output, lookup_table, 5, 8, '=', 6); +} + +string +encodeHex(const vector<uint8_t>& binary) { + static char B16_DIG[] = "0123456789ABCDEF"; + return(encodeBaseN(binary, B16_DIG, 4, 1, 0)); +} + +void +decodeHex(const string& encoded_str, vector<uint8_t>& output) { + static const uint8_t lookup_table[] = { + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xee,0xee,0xee,0xee,0xee,0xff,0xff, // 00-0f + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 10-1f + 0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 20-2f + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,0xff,0xff,0xff,0xff,0xff,0xff, // 30-3f + 0xff,10,11,12,13,14,15,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 40-4f + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 50-5f + 0xff,10,11,12,13,14,15,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 60-6f + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 70-7f + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 80-8f + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 90-9f + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // a0-af + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // b0-bf + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // c0-cf + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // d0-df + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // e0-ef + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff // f0-ff + }; + + decodeBaseN("base16", encoded_str, output, lookup_table, 4, 1, 0, 0); +} + +} // namespace encode +} // namespace util +} // namespace isc diff --git a/src/lib/util/encode/encode.h b/src/lib/util/encode/encode.h new file mode 100644 index 0000000000..2e6bca0e54 --- /dev/null +++ b/src/lib/util/encode/encode.h @@ -0,0 +1,70 @@ +// Copyright (C) 2024 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef ENCODE_H +#define ENCODE_H + +#include <stdint.h> +#include <string> +#include <vector> + +namespace isc { +namespace util { +namespace encode { + +/// @brief Encode binary data in the base32-hex format. +/// +/// @param binary vector object storing the data to be encoded. +/// @return string containing the base32-hex encoded value. +std::string encodeBase32Hex(const std::vector<uint8_t>& binary); + +/// @brief Decode a base32-hex encoded string into binary data. +/// +/// @param encoded_str string containing a base32-hex encoded value. +/// @param[out] output vector into which the decoded binary data is stored. +/// @throw BadValue if the input string is invalid. +void decodeBase32Hex(const std::string& encoded_str, std::vector<uint8_t>& output); + +/// @brief Encode binary data in the base64 format. +/// +/// @param binary vector object storing the data to be encoded. +/// @return string containing the base64 encoded value. +std::string encodeBase64(const std::vector<uint8_t>& binary); + +/// @brief Decode a base64 encoded string into binary data. +/// +/// @param encoded_str string containing a base64 encoded value. +/// @param[out] output vector into which the decoded binary data is stored. +/// @throw BadValue if the input string is invalid. +void decodeBase64(const std::string& encoded_str, std::vector<uint8_t>& output); + +/// @brief Encode binary data in the base16 format. +/// +/// @param binary vector object containing the data to be encoded. +/// @return string containing the base16 encoded value. +std::string encodeHex(const std::vector<uint8_t>& binary); + +/// @brief Decode a base16 encoded string into binary data. +/// +/// @param encoded_str string containing a base16 encoded value. +/// @param[out] output vector into which the decoded binary data is stored. +/// @throw BadValue if the input string is invalid. +void decodeHex(const std::string& encoded_str, std::vector<uint8_t>& output); + +/// @brief Encode in hexadecimal inline +/// +/// @param value the value to encode +/// @return 0x followed by the value encoded in hexa +inline std::string toHex(std::string value) { + std::vector<uint8_t> bin(value.begin(), value.end()); + return ("0x" + encodeHex(bin)); +} + +} // namespace encode +} // namespace util +} // namespace isc + +#endif // ENCODE_H diff --git a/src/lib/util/encode/hex.h b/src/lib/util/encode/hex.h deleted file mode 100644 index de3ac21171..0000000000 --- a/src/lib/util/encode/hex.h +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (C) 2009-2016 Internet Systems Consortium, Inc. ("ISC") -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef HEX_H -#define HEX_H 1 - -#include <stdint.h> -#include <string> -#include <vector> - -// -// Note: this helper module isn't specific to the DNS protocol per se. -// We should probably move this to somewhere else, possibly in some common -// utility area. -// - -namespace isc { -namespace util { -namespace encode { -/// \brief Encode binary data in the base16 ('hex') format. -/// -/// The underlying implementation is shared with \c encodeBase64, and most of -/// the description except the format (base16) equally applies. -/// Another notable exception is that the base16 encoding doesn't require -/// padding, so padding related considerations and the notion of canonical -/// encoding don't apply. -/// -/// \param binary A vector object storing the data to be encoded. -/// \return A newly created string that stores base16 encoded value for -/// binary. -std::string encodeHex(const std::vector<uint8_t>& binary); - -/// \brief Decode a text encoded in the base16 ('hex') format into the -/// original %data. -/// -/// The underlying implementation is shared with \c decodeBase64, and most -/// of the description except the format (base16) equally applies. -/// Another notable exception is that the base16 encoding doesn't require -/// padding, so padding related considerations and the notion of canonical -/// encoding don't apply. -/// -/// \param input A text encoded in the base16 format. -/// \param result A vector in which the decoded %data is to be stored. -void decodeHex(const std::string& input, std::vector<uint8_t>& result); - -/// \brief Encode in hexadecimal inline -/// -/// \param value the value to encode -/// \return 0x followed by the value encoded in hexa -inline std::string toHex(std::string value) { - std::vector<uint8_t> bin(value.begin(), value.end()); - return ("0x" + encodeHex(bin)); -} - -} // namespace encode -} // namespace util -} // namespace isc - -#endif // HEX_H - -// Local Variables: -// mode: c++ -// End: diff --git a/src/lib/util/strutil.cc b/src/lib/util/strutil.cc index 3dd83d1a9b..7c3b2e65e2 100644 --- a/src/lib/util/strutil.cc +++ b/src/lib/util/strutil.cc @@ -6,7 +6,7 @@ #include <config.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/strutil.h> #include <boost/algorithm/string/classification.hpp> diff --git a/src/lib/util/tests/base32hex_unittest.cc b/src/lib/util/tests/base32hex_unittest.cc index 947dc3820c..ff68ba7167 100644 --- a/src/lib/util/tests/base32hex_unittest.cc +++ b/src/lib/util/tests/base32hex_unittest.cc @@ -15,7 +15,7 @@ #include <exceptions/exceptions.h> -#include <util/encode/base32hex.h> +#include <util/encode/encode.h> #include <gtest/gtest.h> diff --git a/src/lib/util/tests/base64_unittest.cc b/src/lib/util/tests/base64_unittest.cc index 6843b594dc..71b4d4214b 100644 --- a/src/lib/util/tests/base64_unittest.cc +++ b/src/lib/util/tests/base64_unittest.cc @@ -12,7 +12,7 @@ #include <exceptions/exceptions.h> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <gtest/gtest.h> diff --git a/src/lib/util/tests/hex_unittest.cc b/src/lib/util/tests/hex_unittest.cc index 1e611b51a3..27fa166bbb 100644 --- a/src/lib/util/tests/hex_unittest.cc +++ b/src/lib/util/tests/hex_unittest.cc @@ -13,7 +13,8 @@ #include <exceptions/exceptions.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> +#include <testutils/gtest_utils.h> #include <gtest/gtest.h> @@ -94,7 +95,12 @@ TEST_F(HexTest, decodeMap) { const char ch = toupper(i); const size_t pos = encoding_chars.find(ch); if (pos == string::npos) { - EXPECT_THROW(decodeHex(input, decoded_data), BadValue); + if (!std::isspace(ch)) { + EXPECT_THROW(decodeHex(input, decoded_data), BadValue) << "input:" << input; + } else { + EXPECT_NO_THROW_LOG(decodeHex(input, decoded_data)); + EXPECT_EQ(0, decoded_data.size()); + } } else { decodeHex(input, decoded_data); EXPECT_EQ(1, decoded_data.size()); diff --git a/src/lib/util/tests/strutil_unittest.cc b/src/lib/util/tests/strutil_unittest.cc index 912b40f0d8..563d4042c3 100644 --- a/src/lib/util/tests/strutil_unittest.cc +++ b/src/lib/util/tests/strutil_unittest.cc @@ -8,7 +8,7 @@ #include <exceptions/exceptions.h> #include <util/strutil.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <gtest/gtest.h> diff --git a/src/lib/yang/adaptor_host.cc b/src/lib/yang/adaptor_host.cc index 43fe4cdd6f..78f427e651 100644 --- a/src/lib/yang/adaptor_host.cc +++ b/src/lib/yang/adaptor_host.cc @@ -6,7 +6,7 @@ #include <config.h> -#include <util/encode/hex.h> +#include <util/encode/encode.h> #include <util/strutil.h> #include <yang/adaptor_host.h> diff --git a/src/lib/yang/translator.cc b/src/lib/yang/translator.cc index cada692476..7857143d66 100644 --- a/src/lib/yang/translator.cc +++ b/src/lib/yang/translator.cc @@ -6,7 +6,7 @@ #include <config.h> -#include <util/encode/base64.h> +#include <util/encode/encode.h> #include <yang/adaptor.h> #include <yang/translator.h> |