From b899e70cd43b8a996849416b2b33266fb5f35269 Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Tue, 8 Oct 2024 12:46:50 +0000 Subject: [PATCH 01/19] officially deprecate commandhandler --- include/dpp/commandhandler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/dpp/commandhandler.h b/include/dpp/commandhandler.h index 724f38f577..4a68343996 100644 --- a/include/dpp/commandhandler.h +++ b/include/dpp/commandhandler.h @@ -253,7 +253,7 @@ struct DPP_EXPORT command_info_t { * functions. * @deprecated commandhandler and message commands are deprecated and dpp::slashcommand is encouraged as a replacement. */ -class DPP_EXPORT commandhandler { +class DPP_EXPORT DPP_DEPRECATED("commandhandler should not be used. Plese consider using dpp::cluster::register_command instead.") commandhandler { private: /** * @brief List of guild commands to bulk register From 588213897ba618b5b08500cd04b23bcc490e6146 Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Tue, 8 Oct 2024 12:55:24 +0000 Subject: [PATCH 02/19] fix: spelling --- include/dpp/commandhandler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/dpp/commandhandler.h b/include/dpp/commandhandler.h index 4a68343996..1958bc43d4 100644 --- a/include/dpp/commandhandler.h +++ b/include/dpp/commandhandler.h @@ -253,7 +253,7 @@ struct DPP_EXPORT command_info_t { * functions. * @deprecated commandhandler and message commands are deprecated and dpp::slashcommand is encouraged as a replacement. */ -class DPP_EXPORT DPP_DEPRECATED("commandhandler should not be used. Plese consider using dpp::cluster::register_command instead.") commandhandler { +class DPP_EXPORT DPP_DEPRECATED("commandhandler should not be used. Please consider using dpp::cluster::register_command instead.") commandhandler { private: /** * @brief List of guild commands to bulk register From 09c530bd01389a673efc11e3b2592f601d58cc31 Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Tue, 8 Oct 2024 13:34:25 +0000 Subject: [PATCH 03/19] this cant be fatal while we are offering documents on deprecated stuff for SEO --- docpages/example_code/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docpages/example_code/CMakeLists.txt b/docpages/example_code/CMakeLists.txt index 87c7713f2b..57f4fee152 100644 --- a/docpages/example_code/CMakeLists.txt +++ b/docpages/example_code/CMakeLists.txt @@ -33,7 +33,7 @@ project(documentation_tests) string(ASCII 27 Esc) -set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDPP_CORO -std=c++20 -pthread -O0 -fPIC -rdynamic -DFMT_HEADER_ONLY -Wall -Wextra -Wpedantic -Werror -Wno-unused-parameter") +set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDPP_CORO -std=c++20 -pthread -O0 -fPIC -rdynamic -DFMT_HEADER_ONLY -Wall -Wextra -Wpedantic -Werror -Wno-unused-parameter -Wno-deprecated-declarations") set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0") file(GLOB example_list ./*.cpp) From 4062965e2a96759e0fb6c94f038bb3c35a5e0f56 Mon Sep 17 00:00:00 2001 From: ruslan-ilesik Date: Tue, 8 Oct 2024 22:27:38 +0200 Subject: [PATCH 04/19] try to fix formatting --- include/dpp/cluster.h | 70 +++++++++++++++++++++++++++++++++++++++++++ src/dpp/cluster.cpp | 60 +++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) diff --git a/include/dpp/cluster.h b/include/dpp/cluster.h index 4dad2327f2..39641f98ca 100644 --- a/include/dpp/cluster.h +++ b/include/dpp/cluster.h @@ -133,6 +133,38 @@ class DPP_EXPORT cluster { */ timer_next_t next_timer; + /** + * @brief Mutex to work with named_commands and synchronize read write access + */ + std::shared_mutex named_commands_mutex; + + /** + * @brief Typedef for slashcommand handler type + */ + using slashcommand_handler_t = std::function; + +#ifdef DPP_CORO + /** + * @brief Typedef for coroutines based slashcommand handler type + */ + using co_slashcommand_handler_t = std::function(const slashcommand_t&)>; + + /** + * @brief Typedef for variant of coroutines based slashcommand handler type and regular version of it + */ + using slashcommand_handler_variant = std::variant; + + /** + * @brief Container to store relation between command name and it's handler + */ + std::map named_commands; +#else + /** + * @brief Container to store relation between command name and it's handler + */ + std::map named_commands; +#endif + /** * @brief Tick active timers */ @@ -436,6 +468,44 @@ class DPP_EXPORT cluster { /* Functions for attaching to event handlers */ + /** + * @brief Register a slash command handler. + * + * @param name The name of the slash command to register + * @param handler A handler function of type `slashcommand_handler_t` + * + * @return bool Returns `true` if the command was registered successfully, or `false` if + * the command with the same name already exists + */ + bool register_command(const std::string& name, const slashcommand_handler_t handler); + +#ifdef DPP_CORO + /** + * @brief Register a coroutine-based slash command handler. + * + * @param name The name of the slash command to register. + * @param handler A coroutine handler function of type `co_slashcommand_handler_t`. + * + * @return bool Returns `true` if the command was registered successfully, or `false` if + * the command with the same name already exists. + */ + bool co_register_command(const std::string& name, const co_slashcommand_handler_t handler); +#endif + + /** + * @brief Unregister a slash command. + * + * This function unregisters (removes) a previously registered slash command by name. + * If the command is successfully removed, it returns `true`. + * + * @param name The name of the slash command to unregister. + * + * @return bool Returns `true` if the command was successfully unregistered, or `false` + * if the command was not found. + */ + bool unregister_command(const std::string& name); + + /** * @brief on voice state update event * diff --git a/src/dpp/cluster.cpp b/src/dpp/cluster.cpp index ff7345428c..3399536ef3 100644 --- a/src/dpp/cluster.cpp +++ b/src/dpp/cluster.cpp @@ -120,6 +120,40 @@ cluster::cluster(const std::string &_token, uint32_t _intents, uint32_t _shards, i_message_content, "You have attached an event to cluster::on_message_update() but have not specified the privileged intent dpp::i_message_content. Message content, embeds, attachments, and components on received guild messages will be empty.") ); + + /* Add slashcommand callback for named commands. */ +#ifdef DPP_CORO + on_slashcommand([this](const slashcommand_t& event) -> task { + slashcommand_handler_variant copy; + { + std::shared_lock lk(named_commands_mutex); + auto it = named_commands.find(event.command.get_command_name()); + if (it == named_commands.end()) { + co_return; // Command not found + } + copy = it->second; + } + if (std::holds_alternative(copy)) { + co_await std::get(copy)(event); + } else if (std::holds_alternative(copy)) { + std::get(copy)(event); + } + co_return; + }); +#else + on_slashcommand([this](const slashcommand_t& event) { + slashcommand_handler_t copy; + { + std::shared_lock lk(named_commands_mutex); + auto it = named_commands.find(event.command.get_command_name()); + if (it == named_commands.end()) { + return; // Command not found + } + copy = it->second; + } + copy(event); + }); +#endif } cluster::~cluster() @@ -466,4 +500,30 @@ cluster& cluster::set_request_timeout(uint16_t timeout) { return *this; } +bool cluster::register_command(const std::string &name, const slashcommand_handler_t handler) { + std::unique_lock lk(named_commands_mutex); + if (named_commands.count(name) != 0) { + return false; + } + named_commands.emplace(name, handler); + return true; +} + +#ifdef DPP_CORO +bool cluster::co_register_command(const std::string& name, const co_slashcommand_handler_t handler) { + std::unique_lock lk(named_commands_mutex); + if (named_commands.count(name) != 0) { + return false; + } + named_commands.emplace(name, handler); + return true; +} +#endif + +bool cluster::unregister_command(const std::string &name) { + std::unique_lock lk(named_commands_mutex); + return named_commands.erase(name) == 1; +} + + }; From 2d1f71bffd6c1a3ac7f13c962d6a137bd29f177e Mon Sep 17 00:00:00 2001 From: ruslan-ilesik Date: Tue, 8 Oct 2024 22:52:15 +0200 Subject: [PATCH 05/19] fix with templates --- include/dpp/cluster.h | 11 ++++++++++- src/dpp/cluster.cpp | 11 ----------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/include/dpp/cluster.h b/include/dpp/cluster.h index 39641f98ca..3e817711da 100644 --- a/include/dpp/cluster.h +++ b/include/dpp/cluster.h @@ -489,7 +489,16 @@ class DPP_EXPORT cluster { * @return bool Returns `true` if the command was registered successfully, or `false` if * the command with the same name already exists. */ - bool co_register_command(const std::string& name, const co_slashcommand_handler_t handler); + template + std::enable_if_t, dpp::task>, bool> + register_command(const std::string& name, F&& handler){ + std::unique_lock lk(named_commands_mutex); + if (named_commands.count(name) != 0) { + return false; + } + named_commands.emplace(name, handler); + return true; + }; #endif /** diff --git a/src/dpp/cluster.cpp b/src/dpp/cluster.cpp index 3399536ef3..36a60d249c 100644 --- a/src/dpp/cluster.cpp +++ b/src/dpp/cluster.cpp @@ -509,17 +509,6 @@ bool cluster::register_command(const std::string &name, const slashcommand_handl return true; } -#ifdef DPP_CORO -bool cluster::co_register_command(const std::string& name, const co_slashcommand_handler_t handler) { - std::unique_lock lk(named_commands_mutex); - if (named_commands.count(name) != 0) { - return false; - } - named_commands.emplace(name, handler); - return true; -} -#endif - bool cluster::unregister_command(const std::string &name) { std::unique_lock lk(named_commands_mutex); return named_commands.erase(name) == 1; From 90fb093e550d626998e5064f478982f3b7653b97 Mon Sep 17 00:00:00 2001 From: ruslan-ilesik Date: Tue, 8 Oct 2024 23:06:24 +0200 Subject: [PATCH 06/19] remove comments --- src/dpp/cluster.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dpp/cluster.cpp b/src/dpp/cluster.cpp index 36a60d249c..105bab0bf2 100644 --- a/src/dpp/cluster.cpp +++ b/src/dpp/cluster.cpp @@ -129,7 +129,7 @@ cluster::cluster(const std::string &_token, uint32_t _intents, uint32_t _shards, std::shared_lock lk(named_commands_mutex); auto it = named_commands.find(event.command.get_command_name()); if (it == named_commands.end()) { - co_return; // Command not found + co_return; } copy = it->second; } @@ -147,7 +147,7 @@ cluster::cluster(const std::string &_token, uint32_t _intents, uint32_t _shards, std::shared_lock lk(named_commands_mutex); auto it = named_commands.find(event.command.get_command_name()); if (it == named_commands.end()) { - return; // Command not found + return; } copy = it->second; } From bad343db0347705675b2fe2401cf0969ffdf1d40 Mon Sep 17 00:00:00 2001 From: ruslan-ilesik Date: Tue, 8 Oct 2024 23:07:31 +0200 Subject: [PATCH 07/19] fix other thing --- include/dpp/cluster.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/dpp/cluster.h b/include/dpp/cluster.h index 3e817711da..8c96862f2f 100644 --- a/include/dpp/cluster.h +++ b/include/dpp/cluster.h @@ -495,7 +495,7 @@ class DPP_EXPORT cluster { std::unique_lock lk(named_commands_mutex); if (named_commands.count(name) != 0) { return false; - } + } named_commands.emplace(name, handler); return true; }; From a8306527b3b4a2f17821846a447c040f49b38b0a Mon Sep 17 00:00:00 2001 From: ruslan-ilesik Date: Tue, 8 Oct 2024 23:08:11 +0200 Subject: [PATCH 08/19] fix other thing --- src/dpp/cluster.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/dpp/cluster.cpp b/src/dpp/cluster.cpp index 105bab0bf2..b08a5a1885 100644 --- a/src/dpp/cluster.cpp +++ b/src/dpp/cluster.cpp @@ -514,5 +514,4 @@ bool cluster::unregister_command(const std::string &name) { return named_commands.erase(name) == 1; } - }; From 083e204d23668f520331af9d73ff8696375d0514 Mon Sep 17 00:00:00 2001 From: ruslan-ilesik Date: Tue, 8 Oct 2024 23:08:39 +0200 Subject: [PATCH 09/19] fix other thing --- include/dpp/cluster.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/dpp/cluster.h b/include/dpp/cluster.h index 8c96862f2f..4e8734b125 100644 --- a/include/dpp/cluster.h +++ b/include/dpp/cluster.h @@ -514,7 +514,6 @@ class DPP_EXPORT cluster { */ bool unregister_command(const std::string& name); - /** * @brief on voice state update event * From 376870f7f6c3ee8ac646fe3de561e521f4ecd6ed Mon Sep 17 00:00:00 2001 From: "Craig Edwards (Brain)" Date: Tue, 8 Oct 2024 22:28:24 +0100 Subject: [PATCH 10/19] style: indentation of lambdas --- src/dpp/cluster.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/dpp/cluster.cpp b/src/dpp/cluster.cpp index b08a5a1885..544902ade1 100644 --- a/src/dpp/cluster.cpp +++ b/src/dpp/cluster.cpp @@ -126,12 +126,12 @@ cluster::cluster(const std::string &_token, uint32_t _intents, uint32_t _shards, on_slashcommand([this](const slashcommand_t& event) -> task { slashcommand_handler_variant copy; { - std::shared_lock lk(named_commands_mutex); - auto it = named_commands.find(event.command.get_command_name()); - if (it == named_commands.end()) { - co_return; - } - copy = it->second; + std::shared_lock lk(named_commands_mutex); + auto it = named_commands.find(event.command.get_command_name()); + if (it == named_commands.end()) { + co_return; + } + copy = it->second; } if (std::holds_alternative(copy)) { co_await std::get(copy)(event); @@ -144,12 +144,12 @@ cluster::cluster(const std::string &_token, uint32_t _intents, uint32_t _shards, on_slashcommand([this](const slashcommand_t& event) { slashcommand_handler_t copy; { - std::shared_lock lk(named_commands_mutex); - auto it = named_commands.find(event.command.get_command_name()); - if (it == named_commands.end()) { - return; - } - copy = it->second; + std::shared_lock lk(named_commands_mutex); + auto it = named_commands.find(event.command.get_command_name()); + if (it == named_commands.end()) { + return; + } + copy = it->second; } copy(event); }); From 2a36704a87c5aa01e8fc5a3e0800931111563a5b Mon Sep 17 00:00:00 2001 From: "Craig Edwards (Brain)" Date: Wed, 9 Oct 2024 00:01:46 +0100 Subject: [PATCH 11/19] refactor: better registration with try_emplace --- src/dpp/cluster.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/dpp/cluster.cpp b/src/dpp/cluster.cpp index 544902ade1..26e333d194 100644 --- a/src/dpp/cluster.cpp +++ b/src/dpp/cluster.cpp @@ -502,11 +502,8 @@ cluster& cluster::set_request_timeout(uint16_t timeout) { bool cluster::register_command(const std::string &name, const slashcommand_handler_t handler) { std::unique_lock lk(named_commands_mutex); - if (named_commands.count(name) != 0) { - return false; - } - named_commands.emplace(name, handler); - return true; + auto [_, inserted] = named_commands.try_emplace(name, handler); + return inserted; } bool cluster::unregister_command(const std::string &name) { From 08b3841a8cf362d97fcea64c178dc12eeeb19a54 Mon Sep 17 00:00:00 2001 From: "Craig Edwards (Brain)" Date: Wed, 9 Oct 2024 00:02:56 +0100 Subject: [PATCH 12/19] Update cluster.h --- include/dpp/cluster.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/include/dpp/cluster.h b/include/dpp/cluster.h index 4e8734b125..787b95d854 100644 --- a/include/dpp/cluster.h +++ b/include/dpp/cluster.h @@ -493,11 +493,8 @@ class DPP_EXPORT cluster { std::enable_if_t, dpp::task>, bool> register_command(const std::string& name, F&& handler){ std::unique_lock lk(named_commands_mutex); - if (named_commands.count(name) != 0) { - return false; - } - named_commands.emplace(name, handler); - return true; + auto [_, inserted] = named_commands.try_emplace(name, handler); + return inserted; }; #endif From 95270f523199ff5b463872fc9fdcf911534258cf Mon Sep 17 00:00:00 2001 From: "Craig Edwards (Brain)" Date: Wed, 9 Oct 2024 00:08:42 +0100 Subject: [PATCH 13/19] refactor: std::forward --- include/dpp/cluster.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/dpp/cluster.h b/include/dpp/cluster.h index 787b95d854..0b6a980e65 100644 --- a/include/dpp/cluster.h +++ b/include/dpp/cluster.h @@ -493,7 +493,7 @@ class DPP_EXPORT cluster { std::enable_if_t, dpp::task>, bool> register_command(const std::string& name, F&& handler){ std::unique_lock lk(named_commands_mutex); - auto [_, inserted] = named_commands.try_emplace(name, handler); + auto [_, inserted] = named_commands.try_emplace(name, std::forward(handler)); return inserted; }; #endif From 74db5ee90ea6653b27462f7b8d19dfa08a5fb445 Mon Sep 17 00:00:00 2001 From: "Craig Edwards (Brain)" Date: Fri, 11 Oct 2024 08:00:02 +0100 Subject: [PATCH 14/19] refactor: why you so salty? Entirely remove libsodium from D++ (#1265) --- .github/workflows/ci.yml | 4 +- .github/workflows/test-docs-examples.yml | 2 +- Dockerfile | 2 +- README.md | 5 +- buildtools/classes/Packager/Vcpkg.php | 1 - cmake/ARM64ToolChain.cmake | 3 +- cmake/ARMv7ToolChain.cmake | 4 +- cmake/CPackSetup.cmake | 4 +- cmake/FindSodium.cmake | 293 ------------------ cmake/LINUXx86ToolChain.cmake | 2 +- cmake/Win32Toolchain.cmake | 5 - docpages/01_frequently_asked_questions.md | 6 +- docpages/advanced_reference/voice_model.md | 8 +- docpages/building/freebsd.md | 10 +- docpages/building/openbsd.md | 2 +- docpages/building/osx.md | 4 +- docpages/images/audioframe.svg | 4 +- docpages/install/install-windows-vs-zip.md | 2 +- docpages/make_a_bot/windows_vs.md | 2 +- docpages/make_a_bot/windows_wsl.md | 2 +- include/dpp/cluster.h | 2 +- include/dpp/discordvoiceclient.h | 16 +- include/dpp/exception.h | 5 +- include/dpp/utility.h | 2 +- library-vcpkg/CMakeLists.txt | 2 - library/CMakeLists.txt | 38 +-- src/davetest/dave.cpp | 3 + src/dpp/discordvoiceclient.cpp | 2 - src/dpp/voice/enabled/audio_mix.cpp | 2 - src/dpp/voice/enabled/constructor.cpp | 9 - src/dpp/voice/enabled/enabled.h | 48 ++- src/dpp/voice/enabled/handle_frame.cpp | 2 + src/dpp/voice/enabled/opus.cpp | 17 +- src/dpp/voice/enabled/read_ready.cpp | 2 +- src/dpp/voice/enabled/xchacha20.cpp | 234 ++++++++++++++ vcpkg/ports/dpp/vcpkg.json | 1 - win32/32/bin/libsodium.dll | Bin 336896 -> 0 bytes win32/bin/libsodium.dll | Bin 330752 -> 0 bytes win32/include/sodium.h | 69 ----- win32/include/sodium/core.h | 28 -- win32/include/sodium/crypto_aead_aes256gcm.h | 179 ----------- .../sodium/crypto_aead_chacha20poly1305.h | 180 ----------- .../sodium/crypto_aead_xchacha20poly1305.h | 100 ------ win32/include/sodium/crypto_auth.h | 46 --- win32/include/sodium/crypto_auth_hmacsha256.h | 70 ----- win32/include/sodium/crypto_auth_hmacsha512.h | 68 ---- .../sodium/crypto_auth_hmacsha512256.h | 65 ---- win32/include/sodium/crypto_box.h | 177 ----------- .../crypto_box_curve25519xchacha20poly1305.h | 164 ---------- .../crypto_box_curve25519xsalsa20poly1305.h | 112 ------- win32/include/sodium/crypto_core_ed25519.h | 100 ------ win32/include/sodium/crypto_core_hchacha20.h | 36 --- win32/include/sodium/crypto_core_hsalsa20.h | 36 --- .../include/sodium/crypto_core_ristretto255.h | 100 ------ win32/include/sodium/crypto_core_salsa20.h | 36 --- win32/include/sodium/crypto_core_salsa2012.h | 36 --- win32/include/sodium/crypto_core_salsa208.h | 40 --- win32/include/sodium/crypto_generichash.h | 84 ----- .../sodium/crypto_generichash_blake2b.h | 118 ------- win32/include/sodium/crypto_hash.h | 40 --- win32/include/sodium/crypto_hash_sha256.h | 60 ---- win32/include/sodium/crypto_hash_sha512.h | 60 ---- win32/include/sodium/crypto_kdf.h | 53 ---- win32/include/sodium/crypto_kdf_blake2b.h | 44 --- win32/include/sodium/crypto_kx.h | 66 ---- win32/include/sodium/crypto_onetimeauth.h | 65 ---- .../sodium/crypto_onetimeauth_poly1305.h | 72 ----- win32/include/sodium/crypto_pwhash.h | 147 --------- win32/include/sodium/crypto_pwhash_argon2i.h | 122 -------- win32/include/sodium/crypto_pwhash_argon2id.h | 122 -------- .../crypto_pwhash_scryptsalsa208sha256.h | 120 ------- win32/include/sodium/crypto_scalarmult.h | 46 --- .../sodium/crypto_scalarmult_curve25519.h | 42 --- .../sodium/crypto_scalarmult_ed25519.h | 51 --- .../sodium/crypto_scalarmult_ristretto255.h | 43 --- win32/include/sodium/crypto_secretbox.h | 93 ------ .../crypto_secretbox_xchacha20poly1305.h | 70 ----- .../crypto_secretbox_xsalsa20poly1305.h | 69 ----- .../crypto_secretstream_xchacha20poly1305.h | 108 ------- win32/include/sodium/crypto_shorthash.h | 41 --- .../sodium/crypto_shorthash_siphash24.h | 50 --- win32/include/sodium/crypto_sign.h | 107 ------- win32/include/sodium/crypto_sign_ed25519.h | 124 -------- .../crypto_sign_edwards25519sha512batch.h | 55 ---- win32/include/sodium/crypto_stream.h | 59 ---- win32/include/sodium/crypto_stream_chacha20.h | 106 ------- win32/include/sodium/crypto_stream_salsa20.h | 61 ---- .../include/sodium/crypto_stream_salsa2012.h | 53 ---- win32/include/sodium/crypto_stream_salsa208.h | 56 ---- .../include/sodium/crypto_stream_xchacha20.h | 61 ---- win32/include/sodium/crypto_stream_xsalsa20.h | 61 ---- win32/include/sodium/crypto_verify_16.h | 23 -- win32/include/sodium/crypto_verify_32.h | 23 -- win32/include/sodium/crypto_verify_64.h | 23 -- win32/include/sodium/export.h | 57 ---- win32/include/sodium/randombytes.h | 72 ----- .../sodium/randombytes_internal_random.h | 22 -- win32/include/sodium/randombytes_sysrandom.h | 19 -- win32/include/sodium/runtime.h | 52 ---- win32/include/sodium/utils.h | 179 ----------- win32/include/sodium/version.h | 33 -- 101 files changed, 339 insertions(+), 5085 deletions(-) delete mode 100644 cmake/FindSodium.cmake create mode 100644 src/dpp/voice/enabled/xchacha20.cpp delete mode 100755 win32/32/bin/libsodium.dll delete mode 100644 win32/bin/libsodium.dll delete mode 100644 win32/include/sodium.h delete mode 100644 win32/include/sodium/core.h delete mode 100644 win32/include/sodium/crypto_aead_aes256gcm.h delete mode 100644 win32/include/sodium/crypto_aead_chacha20poly1305.h delete mode 100644 win32/include/sodium/crypto_aead_xchacha20poly1305.h delete mode 100644 win32/include/sodium/crypto_auth.h delete mode 100644 win32/include/sodium/crypto_auth_hmacsha256.h delete mode 100644 win32/include/sodium/crypto_auth_hmacsha512.h delete mode 100644 win32/include/sodium/crypto_auth_hmacsha512256.h delete mode 100644 win32/include/sodium/crypto_box.h delete mode 100644 win32/include/sodium/crypto_box_curve25519xchacha20poly1305.h delete mode 100644 win32/include/sodium/crypto_box_curve25519xsalsa20poly1305.h delete mode 100644 win32/include/sodium/crypto_core_ed25519.h delete mode 100644 win32/include/sodium/crypto_core_hchacha20.h delete mode 100644 win32/include/sodium/crypto_core_hsalsa20.h delete mode 100644 win32/include/sodium/crypto_core_ristretto255.h delete mode 100644 win32/include/sodium/crypto_core_salsa20.h delete mode 100644 win32/include/sodium/crypto_core_salsa2012.h delete mode 100644 win32/include/sodium/crypto_core_salsa208.h delete mode 100644 win32/include/sodium/crypto_generichash.h delete mode 100644 win32/include/sodium/crypto_generichash_blake2b.h delete mode 100644 win32/include/sodium/crypto_hash.h delete mode 100644 win32/include/sodium/crypto_hash_sha256.h delete mode 100644 win32/include/sodium/crypto_hash_sha512.h delete mode 100644 win32/include/sodium/crypto_kdf.h delete mode 100644 win32/include/sodium/crypto_kdf_blake2b.h delete mode 100644 win32/include/sodium/crypto_kx.h delete mode 100644 win32/include/sodium/crypto_onetimeauth.h delete mode 100644 win32/include/sodium/crypto_onetimeauth_poly1305.h delete mode 100644 win32/include/sodium/crypto_pwhash.h delete mode 100644 win32/include/sodium/crypto_pwhash_argon2i.h delete mode 100644 win32/include/sodium/crypto_pwhash_argon2id.h delete mode 100644 win32/include/sodium/crypto_pwhash_scryptsalsa208sha256.h delete mode 100644 win32/include/sodium/crypto_scalarmult.h delete mode 100644 win32/include/sodium/crypto_scalarmult_curve25519.h delete mode 100644 win32/include/sodium/crypto_scalarmult_ed25519.h delete mode 100644 win32/include/sodium/crypto_scalarmult_ristretto255.h delete mode 100644 win32/include/sodium/crypto_secretbox.h delete mode 100644 win32/include/sodium/crypto_secretbox_xchacha20poly1305.h delete mode 100644 win32/include/sodium/crypto_secretbox_xsalsa20poly1305.h delete mode 100644 win32/include/sodium/crypto_secretstream_xchacha20poly1305.h delete mode 100644 win32/include/sodium/crypto_shorthash.h delete mode 100644 win32/include/sodium/crypto_shorthash_siphash24.h delete mode 100644 win32/include/sodium/crypto_sign.h delete mode 100644 win32/include/sodium/crypto_sign_ed25519.h delete mode 100644 win32/include/sodium/crypto_sign_edwards25519sha512batch.h delete mode 100644 win32/include/sodium/crypto_stream.h delete mode 100644 win32/include/sodium/crypto_stream_chacha20.h delete mode 100644 win32/include/sodium/crypto_stream_salsa20.h delete mode 100644 win32/include/sodium/crypto_stream_salsa2012.h delete mode 100644 win32/include/sodium/crypto_stream_salsa208.h delete mode 100644 win32/include/sodium/crypto_stream_xchacha20.h delete mode 100644 win32/include/sodium/crypto_stream_xsalsa20.h delete mode 100644 win32/include/sodium/crypto_verify_16.h delete mode 100644 win32/include/sodium/crypto_verify_32.h delete mode 100644 win32/include/sodium/crypto_verify_64.h delete mode 100644 win32/include/sodium/export.h delete mode 100644 win32/include/sodium/randombytes.h delete mode 100644 win32/include/sodium/randombytes_internal_random.h delete mode 100644 win32/include/sodium/randombytes_sysrandom.h delete mode 100644 win32/include/sodium/runtime.h delete mode 100644 win32/include/sodium/utils.h delete mode 100644 win32/include/sodium/version.h diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3b034bcd83..00579aefac 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -84,7 +84,7 @@ jobs: sudo apt-add-repository -y "deb http://apt.llvm.org/$osname/ llvm-toolchain-$osname-${{ matrix.cfg.version }} main" - name: Install apt packages - run: sudo sed -i 's/azure\.//' /etc/apt/sources.list && sudo apt update && sudo apt-get install -y ${{ matrix.cfg.package }} pkg-config libsodium-dev libopus-dev zlib1g-dev rpm + run: sudo sed -i 's/azure\.//' /etc/apt/sources.list && sudo apt update && sudo apt-get install -y ${{ matrix.cfg.package }} pkg-config libopus-dev zlib1g-dev rpm - name: Generate CMake run: cmake -B build -DDPP_NO_VCPKG=ON -DAVX_TYPE=AVX0 -DCMAKE_BUILD_TYPE=Release ${{matrix.cfg.cmake-flags}} @@ -150,7 +150,7 @@ jobs: xcode-version: ${{ matrix.cfg.xcode-version }} - name: Install homebrew packages - run: brew install cmake make libsodium opus openssl pkg-config + run: brew install cmake make opus openssl pkg-config - name: Generate CMake run: cmake -B build -DDPP_NO_VCPKG=ON -DCMAKE_BUILD_TYPE=Release -DDPP_CORO=ON -DAVX_TYPE=AVX0 diff --git a/.github/workflows/test-docs-examples.yml b/.github/workflows/test-docs-examples.yml index 4b5dfb4758..648916d6b3 100644 --- a/.github/workflows/test-docs-examples.yml +++ b/.github/workflows/test-docs-examples.yml @@ -35,7 +35,7 @@ jobs: submodules: recursive - name: Install apt packages - run: sudo sed -i 's/azure\.//' /etc/apt/sources.list && sudo apt-get update && sudo apt-get install -y g++-12 libsodium-dev libopus-dev zlib1g-dev libmpg123-dev liboggz-dev cmake libfmt-dev libopusfile-dev + run: sudo sed -i 's/azure\.//' /etc/apt/sources.list && sudo apt-get update && sudo apt-get install -y g++-12 libopus-dev zlib1g-dev libmpg123-dev liboggz-dev cmake libfmt-dev libopusfile-dev - name: Generate CMake run: mkdir build && cd build && cmake -DDPP_NO_VCPKG=ON -DAVX_TYPE=T_fallback -DDPP_CORO=ON -DCMAKE_BUILD_TYPE=Debug .. diff --git a/Dockerfile b/Dockerfile index 780c2e2af9..5ae726414a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM ubuntu:noble@sha256:b359f1067efa76f37863778f7b6d0e8d911e3ee8efa807ad01fbf5dc1ef9006b -RUN apt-get update && apt-get install --no-install-recommends -y libssl-dev zlib1g-dev libsodium-dev libopus-dev cmake pkg-config g++ gcc git make && apt-get clean && rm -rf /var/lib/apt/lists/* +RUN apt-get update && apt-get install --no-install-recommends -y libssl-dev zlib1g-dev libopus-dev cmake pkg-config g++ gcc git make && apt-get clean && rm -rf /var/lib/apt/lists/* WORKDIR /usr/src/DPP diff --git a/README.md b/README.md index f2ae8a4bd7..f0a658892a 100644 --- a/README.md +++ b/README.md @@ -155,10 +155,9 @@ Other compilers may work (either newer versions of those listed above, or differ #### Optional Dependencies -For **voice support** you require both of: +For **voice support** you require: * [libopus](https://www.opus-codec.org) (For audio encoding/decoding) -* [libsodium](https://libsodium.org/) (For transport layer encryption) -* Note that our **windows zips** come packaged with copies of both libraries - you do not need to install them yourself! +* Note that our **windows zips** come packaged with copies of this library - you do not need to install it yourself! ### Included Dependencies (Packaged with the library) diff --git a/buildtools/classes/Packager/Vcpkg.php b/buildtools/classes/Packager/Vcpkg.php index 1790cbefc2..f677ba6675 100644 --- a/buildtools/classes/Packager/Vcpkg.php +++ b/buildtools/classes/Packager/Vcpkg.php @@ -170,7 +170,6 @@ function constructPortAndVersionFile(string $sha512 = "0"): string "license": "Apache-2.0", "supports": "((windows & !static & !uwp) | linux | osx)", "dependencies": [ - "libsodium", "nlohmann-json", "openssl", "opus", diff --git a/cmake/ARM64ToolChain.cmake b/cmake/ARM64ToolChain.cmake index 8087e3f375..d9caf02693 100644 --- a/cmake/ARM64ToolChain.cmake +++ b/cmake/ARM64ToolChain.cmake @@ -47,6 +47,5 @@ EXECUTE_PROCESS(COMMAND sudo mv TMPFILE /etc/apt/sources.list) EXECUTE_PROCESS(COMMAND sudo dpkg --add-architecture arm64) EXECUTE_PROCESS(COMMAND sudo apt-add-repository -y ppa:canonical-kernel-team/ppa) EXECUTE_PROCESS(COMMAND sudo apt update) -EXECUTE_PROCESS(COMMAND sudo apt install -y cmake gcc-8-aarch64-linux-gnu g++-8-aarch64-linux-gnu libc6-dev-arm64-cross zlib1g-dev:arm64 libssl-dev:arm64 libopus-dev:arm64 libsodium-dev:arm64) -EXECUTE_PROCESS(COMMAND sudo mv /usr/lib/aarch64-linux-gnu/pkgconfig/libsodium.pc /usr/lib/pkgconfig/) +EXECUTE_PROCESS(COMMAND sudo apt install -y cmake gcc-8-aarch64-linux-gnu g++-8-aarch64-linux-gnu libc6-dev-arm64-cross zlib1g-dev:arm64 libssl-dev:arm64 libopus-dev:arm64) diff --git a/cmake/ARMv7ToolChain.cmake b/cmake/ARMv7ToolChain.cmake index 7b9bacf3bc..215df7e0ce 100644 --- a/cmake/ARMv7ToolChain.cmake +++ b/cmake/ARMv7ToolChain.cmake @@ -46,6 +46,4 @@ EXECUTE_PROCESS(COMMAND printf "deb [arch=amd64] http://archive.ubuntu.com/ubunt EXECUTE_PROCESS(COMMAND sudo mv TMPFILE /etc/apt/sources.list) EXECUTE_PROCESS(COMMAND sudo dpkg --add-architecture armhf) EXECUTE_PROCESS(COMMAND sudo apt update) -EXECUTE_PROCESS(COMMAND sudo apt install -y cmake gcc-8-arm-linux-gnueabihf g++-8-arm-linux-gnueabihf zlib1g-dev:armhf libssl-dev:armhf libopus-dev:armhf libsodium-dev:armhf) -EXECUTE_PROCESS(COMMAND sudo mv /usr/lib/arm-linux-gnueabihf/pkgconfig/libsodium.pc /usr/lib/pkgconfig/) - +EXECUTE_PROCESS(COMMAND sudo apt install -y cmake gcc-8-arm-linux-gnueabihf g++-8-arm-linux-gnueabihf zlib1g-dev:armhf libssl-dev:armhf libopus-dev:armhf) diff --git a/cmake/CPackSetup.cmake b/cmake/CPackSetup.cmake index fcdcf156af..047b7600ff 100644 --- a/cmake/CPackSetup.cmake +++ b/cmake/CPackSetup.cmake @@ -50,8 +50,8 @@ set(CPACK_FREEBSD_PACKAGE_MAINTAINER "bsd@dpp.dev") set(CPACK_FREEBSD_PACKAGE_ORIGIN "misc/libdpp") set(CPACK_RPM_PACKAGE_LICENSE "Apache 2.0") set(CPACK_PACKAGE_CONTACT "https://discord.gg/dpp") # D++ Development Discord -set(CPACK_DEBIAN_PACKAGE_DEPENDS "libsodium23 (>= 1.0.17-1), libopus0 (>= 1.3-1)") -set(CPACK_RPM_PACKAGE_REQUIRES "libsodium >= 1.0.20-1, opus >= 1.3.1") +set(CPACK_DEBIAN_PACKAGE_DEPENDS "libopus0 (>= 1.3-1)") +set(CPACK_RPM_PACKAGE_REQUIRES "opus >= 1.3.1") set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "An incredibly lightweight C++ Discord library") set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") set(CPACK_DEBIAN_PACKAGE_SECTION "libs") diff --git a/cmake/FindSodium.cmake b/cmake/FindSodium.cmake deleted file mode 100644 index fbcc45ad11..0000000000 --- a/cmake/FindSodium.cmake +++ /dev/null @@ -1,293 +0,0 @@ -# Written in 2016 by Henrik Steffen Gaßmann -# -# To the extent possible under law, the author(s) have dedicated all copyright -# and related and neighboring rights to this software to the public domain -# worldwide. This software is distributed without any warranty. -# -# You should have received a copy of the CC0 Public Domain Dedication along with -# this software. If not, see -# -# http://creativecommons.org/publicdomain/zero/1.0/ -# -# ############################################################################## -# Tries to find the local libsodium installation. -# -# On Windows the sodium_DIR environment variable is used as a default hint which -# can be overridden by setting the corresponding cmake variable. -# -# Once done the following variables will be defined: -# -# sodium_FOUND sodium_INCLUDE_DIR sodium_LIBRARY_DEBUG sodium_LIBRARY_RELEASE -# sodium_VERSION_STRING -# -# Furthermore an imported "sodium" target is created. -# - -if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang") - set(_GCC_COMPATIBLE 1) -endif() - -# static library option -if(NOT DEFINED sodium_USE_STATIC_LIBS) - option(sodium_USE_STATIC_LIBS "enable to statically link against sodium" OFF) -endif() -if(NOT (sodium_USE_STATIC_LIBS EQUAL sodium_USE_STATIC_LIBS_LAST)) - unset(sodium_LIBRARY CACHE) - unset(sodium_LIBRARY_DEBUG CACHE) - unset(sodium_LIBRARY_RELEASE CACHE) - unset(sodium_DLL_DEBUG CACHE) - unset(sodium_DLL_RELEASE CACHE) - set(sodium_USE_STATIC_LIBS_LAST - ${sodium_USE_STATIC_LIBS} - CACHE INTERNAL "internal change tracking variable") -endif() - -# ############################################################################## -# UNIX -if(UNIX) - # import pkg-config - find_package(PkgConfig) - if(PKG_CONFIG_FOUND) - pkg_check_modules(sodium_PKG QUIET libsodium) - endif() - - if(sodium_USE_STATIC_LIBS) - if(sodium_PKG_STATIC_LIBRARIES) - foreach(_libname ${sodium_PKG_STATIC_LIBRARIES}) - if(NOT _libname MATCHES "^lib.*\\.a$") # ignore strings already ending - # with .a - list(INSERT sodium_PKG_STATIC_LIBRARIES 0 "lib${_libname}.a") - endif() - endforeach() - list(REMOVE_DUPLICATES sodium_PKG_STATIC_LIBRARIES) - else() - # if pkgconfig for libsodium doesn't provide static lib info, then - # override PKG_STATIC here.. - set(sodium_PKG_STATIC_LIBRARIES libsodium.a) - endif() - - set(XPREFIX sodium_PKG_STATIC) - else() - if(sodium_PKG_LIBRARIES STREQUAL "") - set(sodium_PKG_LIBRARIES sodium) - endif() - - set(XPREFIX sodium_PKG) - endif() - - find_path(sodium_INCLUDE_DIR sodium.h HINTS ${${XPREFIX}_INCLUDE_DIRS}) - find_library(sodium_LIBRARY_DEBUG - NAMES ${${XPREFIX}_LIBRARIES} - HINTS ${${XPREFIX}_LIBRARY_DIRS}) - find_library(sodium_LIBRARY_RELEASE - NAMES ${${XPREFIX}_LIBRARIES} - HINTS ${${XPREFIX}_LIBRARY_DIRS}) - - # ############################################################################ - # Windows -elseif(WIN32) - set(sodium_DIR "$ENV{sodium_DIR}" CACHE FILEPATH "sodium install directory") - mark_as_advanced(sodium_DIR) - - find_path(sodium_INCLUDE_DIR sodium.h - HINTS ${sodium_DIR} - PATH_SUFFIXES include) - - if(MSVC) - # detect target architecture - file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/arch.cpp" [=[ - #if defined _M_IX86 - #error ARCH_VALUE x86_32 - #elif defined _M_X64 - #error ARCH_VALUE x86_64 - #endif - #error ARCH_VALUE unknown - ]=]) - try_compile(_UNUSED_VAR "${CMAKE_CURRENT_BINARY_DIR}" - "${CMAKE_CURRENT_BINARY_DIR}/arch.cpp" - OUTPUT_VARIABLE _COMPILATION_LOG) - string(REGEX - REPLACE ".*ARCH_VALUE ([a-zA-Z0-9_]+).*" - "\\1" - _TARGET_ARCH - "${_COMPILATION_LOG}") - - # construct library path - if(_TARGET_ARCH STREQUAL "x86_32") - string(APPEND _PLATFORM_PATH "Win32") - elseif(_TARGET_ARCH STREQUAL "x86_64") - string(APPEND _PLATFORM_PATH "x64") - else() - message( - FATAL_ERROR - "the ${_TARGET_ARCH} architecture is not supported by Findsodium.cmake." - ) - endif() - string(APPEND _PLATFORM_PATH "/$$CONFIG$$") - - if(MSVC_VERSION LESS 1900) - math(EXPR _VS_VERSION "${MSVC_VERSION} / 10 - 60") - else() - math(EXPR _VS_VERSION "${MSVC_VERSION} / 10 - 50") - endif() - string(APPEND _PLATFORM_PATH "/v${_VS_VERSION}") - - if(sodium_USE_STATIC_LIBS) - string(APPEND _PLATFORM_PATH "/static") - else() - string(APPEND _PLATFORM_PATH "/dynamic") - endif() - - string(REPLACE "$$CONFIG$$" - "Debug" - _DEBUG_PATH_SUFFIX - "${_PLATFORM_PATH}") - string(REPLACE "$$CONFIG$$" - "Release" - _RELEASE_PATH_SUFFIX - "${_PLATFORM_PATH}") - - find_library(sodium_LIBRARY_DEBUG libsodium.lib - HINTS ${sodium_DIR} - PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX}) - find_library(sodium_LIBRARY_RELEASE libsodium.lib - HINTS ${sodium_DIR} - PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX}) - if(NOT sodium_USE_STATIC_LIBS) - set(CMAKE_FIND_LIBRARY_SUFFIXES_BCK ${CMAKE_FIND_LIBRARY_SUFFIXES}) - set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll") - find_library(sodium_DLL_DEBUG libsodium - HINTS ${sodium_DIR} - PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX}) - find_library(sodium_DLL_RELEASE libsodium - HINTS ${sodium_DIR} - PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX}) - set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_BCK}) - endif() - - elseif(_GCC_COMPATIBLE) - if(sodium_USE_STATIC_LIBS) - find_library(sodium_LIBRARY_DEBUG libsodium.a - HINTS ${sodium_DIR} - PATH_SUFFIXES lib) - find_library(sodium_LIBRARY_RELEASE libsodium.a - HINTS ${sodium_DIR} - PATH_SUFFIXES lib) - else() - find_library(sodium_LIBRARY_DEBUG libsodium.dll.a - HINTS ${sodium_DIR} - PATH_SUFFIXES lib) - find_library(sodium_LIBRARY_RELEASE libsodium.dll.a - HINTS ${sodium_DIR} - PATH_SUFFIXES lib) - - file(GLOB _DLL - LIST_DIRECTORIES false - RELATIVE "${sodium_DIR}/bin" - "${sodium_DIR}/bin/libsodium*.dll") - find_library(sodium_DLL_DEBUG ${_DLL} libsodium - HINTS ${sodium_DIR} - PATH_SUFFIXES bin) - find_library(sodium_DLL_RELEASE ${_DLL} libsodium - HINTS ${sodium_DIR} - PATH_SUFFIXES bin) - endif() - else() - message(FATAL_ERROR "this platform is not supported by FindSodium.cmake") - endif() - - # ############################################################################ - # unsupported -else() - message(FATAL_ERROR "this platform is not supported by FindSodium.cmake") -endif() - -# ############################################################################## -# common stuff - -# extract sodium version -if(sodium_INCLUDE_DIR) - set(_VERSION_HEADER "${sodium_INCLUDE_DIR}/sodium/version.h") - if(EXISTS "${_VERSION_HEADER}") - file(READ "${_VERSION_HEADER}" _VERSION_HEADER_CONTENT) - string( - REGEX - REPLACE - ".*#define[ \t]*SODIUM_VERSION_STRING[ \t]*\"([^\n]*)\".*" - "\\1" - sodium_VERSION_STRING - "${_VERSION_HEADER_CONTENT}") - set(sodium_VERSION_STRING "${sodium_VERSION_STRING}") - endif() -endif() - -# communicate results -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(sodium - REQUIRED_VARS - sodium_LIBRARY_RELEASE - sodium_LIBRARY_DEBUG - sodium_INCLUDE_DIR - VERSION_VAR - sodium_VERSION_STRING) - -# mark file paths as advanced -mark_as_advanced(sodium_INCLUDE_DIR) -mark_as_advanced(sodium_LIBRARY_DEBUG) -mark_as_advanced(sodium_LIBRARY_RELEASE) -if(WIN32) - mark_as_advanced(sodium_DLL_DEBUG) - mark_as_advanced(sodium_DLL_RELEASE) -endif() - -# create imported target -if(sodium_USE_STATIC_LIBS) - set(_LIB_TYPE STATIC) -else() - set(_LIB_TYPE SHARED) -endif() -add_library(sodium ${_LIB_TYPE} IMPORTED) - -set_target_properties(sodium - PROPERTIES INTERFACE_INCLUDE_DIRECTORIES - "${sodium_INCLUDE_DIR}" - IMPORTED_LINK_INTERFACE_LANGUAGES - "C") - -if(sodium_USE_STATIC_LIBS) - set_target_properties(sodium - PROPERTIES INTERFACE_COMPILE_DEFINITIONS - "SODIUM_STATIC" - IMPORTED_LOCATION - "${sodium_LIBRARY_RELEASE}" - IMPORTED_LOCATION_DEBUG - "${sodium_LIBRARY_DEBUG}") -else() - if(UNIX) - set_target_properties(sodium - PROPERTIES IMPORTED_LOCATION - "${sodium_LIBRARY_RELEASE}" - IMPORTED_LOCATION_DEBUG - "${sodium_LIBRARY_DEBUG}") - elseif(WIN32) - set_target_properties(sodium - PROPERTIES IMPORTED_IMPLIB - "${sodium_LIBRARY_RELEASE}" - IMPORTED_IMPLIB_DEBUG - "${sodium_LIBRARY_DEBUG}") - if(NOT (sodium_DLL_DEBUG MATCHES ".*-NOTFOUND")) - set_target_properties(sodium - PROPERTIES IMPORTED_LOCATION_DEBUG - "${sodium_DLL_DEBUG}") - endif() - if(NOT (sodium_DLL_RELEASE MATCHES ".*-NOTFOUND")) - set_target_properties(sodium - PROPERTIES IMPORTED_LOCATION_RELWITHDEBINFO - "${sodium_DLL_RELEASE}" - IMPORTED_LOCATION_MINSIZEREL - "${sodium_DLL_RELEASE}" - IMPORTED_LOCATION_RELEASE - "${sodium_DLL_RELEASE}") - endif() - endif() -endif() diff --git a/cmake/LINUXx86ToolChain.cmake b/cmake/LINUXx86ToolChain.cmake index 240eb269aa..e943b2aafd 100644 --- a/cmake/LINUXx86ToolChain.cmake +++ b/cmake/LINUXx86ToolChain.cmake @@ -26,7 +26,7 @@ set(T_AVX_EXITCODE "0" CACHE STRING INTERNAL FORCE) EXECUTE_PROCESS(COMMAND sudo dpkg --add-architecture i386) EXECUTE_PROCESS(COMMAND sudo apt-get update) -EXECUTE_PROCESS(COMMAND sudo apt-get install -qq -y g++-10 gcc-10-multilib glibc-*:i386 libc6-dev-i386 g++-10-multilib zlib1g-dev:i386 libssl-dev:i386 libopus-dev:i386 libsodium-dev:i386) +EXECUTE_PROCESS(COMMAND sudo apt-get install -qq -y g++-10 gcc-10-multilib glibc-*:i386 libc6-dev-i386 g++-10-multilib zlib1g-dev:i386 libssl-dev:i386 libopus-dev:i386) EXECUTE_PROCESS(COMMAND export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig/) set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY") diff --git a/cmake/Win32Toolchain.cmake b/cmake/Win32Toolchain.cmake index 7b1ab655ad..ec20c1ab8a 100644 --- a/cmake/Win32Toolchain.cmake +++ b/cmake/Win32Toolchain.cmake @@ -10,17 +10,12 @@ ADD_DEFINITIONS(/bigobj) link_libraries("${PROJECT_SOURCE_DIR}/win32/32/lib/libssl.lib") link_libraries("${PROJECT_SOURCE_DIR}/win32/32/lib/libcrypto.lib") link_libraries("${PROJECT_SOURCE_DIR}/win32/32/lib/zlib.lib") -link_libraries("${PROJECT_SOURCE_DIR}/win32/32/lib/libsodium.lib") link_libraries("${PROJECT_SOURCE_DIR}/win32/32/lib/opus.lib") set(OPUS_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/win32/include") set(OPUS_LIBRARIES "${PROJECT_SOURCE_DIR}/win32/32/lib/opus.lib") -set(sodium_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/win32/include") -set(sodium_LIBRARY_DEBUG "${PROJECT_SOURCE_DIR}/win32/32/lib/libsodium.lib") -set(sodium_LIBRARY_RELEASE "${PROJECT_SOURCE_DIR}/win32/32/lib/libsodium.lib") set(HAVE_OPUS_OPUS_H "${PROJECT_SOURCE_DIR}/win32/include/opus/opus.h") set(OPUS_FOUND 1) -SET(sodium_VERSION_STRING "win32 bundled") include_directories("${PROJECT_SOURCE_DIR}/win32/include") diff --git a/docpages/01_frequently_asked_questions.md b/docpages/01_frequently_asked_questions.md index 8c82b46f6d..62336d6ff9 100644 --- a/docpages/01_frequently_asked_questions.md +++ b/docpages/01_frequently_asked_questions.md @@ -68,7 +68,7 @@ All functions within D++ are multi-threaded. You should still avoid doing long o ## Does this library support voice? -Yes! This library supports voice and will automatically enable voice if your system has the libopus and libsodium libraries. When running `cmake` the script will identify if these libraries are found. See the example programs for information on how to send audio. +Yes! This library supports voice and will automatically enable voice if your system has the libopus library. When running `cmake` the script will identify if this library is found. See the example programs for information on how to send audio. ## Does this library support sharding? @@ -94,10 +94,6 @@ No, the library only requires C++17. We have some optional features such as \ref To fix this issue, run `ldconfig`: `sudo ldconfig` as root. Log out if your SSH session and log back in, and the bot should be able to find the library. -## When compiling with voice support, I get an error: "No rule to make target 'sodium_LIBRARY_DEBUG-NOTFOUND', needed by 'libdpp.so'. Stop." - -The libsodium package requires pkg-config, but does not check for it when installed. Install it as root, e.g. `sudo apt install pkg-config`. Rerun cmake, and rebuild the library. - ## When I try to instantiate a dpp::cluster in windows, I get "D++ Debug/Release mismatch" If this happens, ensure you are using the correct precompiled build of the library. Our precompiled binaries are built in two forms, **release mode** and **debug mode** for Visual Studio 2019/2022. These two versions of the library are not cross-compatible due to differences in the debug and release STL (Microsoft standard library implementation). You should not need to build your own copy, but please see the section about \ref buildwindows for more information on how to build your own copy, if needed. diff --git a/docpages/advanced_reference/voice_model.md b/docpages/advanced_reference/voice_model.md index ca4525d174..15864fa0ed 100644 --- a/docpages/advanced_reference/voice_model.md +++ b/docpages/advanced_reference/voice_model.md @@ -11,7 +11,7 @@ initial connection to this secondary websocket. Every connection to a voice chan Once connected to this websocket, the library negotiates which protocols it supports and what encryption schemes to use. If you enabled DAVE (Discord's end-to-end encryption scheme) this is negotiated first. An MLS (message layer security) group is joined or created. If you did not enable DAVE, this step is bypassed. -The secondary websocket then gives the library a shared encryption secret and the hostname of an RTP server, which is used to encrypt RTP packets using libsodium. +The secondary websocket then gives the library a shared encryption secret and the hostname of an RTP server, which is used to encrypt RTP packets using libssl. This is stored for later. The next step is to send an initial packet to the RTP server so that the library can detect the public IP where the bot is running. Once the RTP server replies, @@ -153,9 +153,9 @@ digraph "Example Directory" { "discord_voice_client::send_audio_*()" -> "Dave encryption on"; "discord_voice_client::send_audio_*()" -> "Dave encryption off"; "Dave encryption on" -> "AES AEAD encryption\nof OPUS stream\nusing ratchet"; - "AES AEAD encryption\nof OPUS stream\nusing ratchet" -> "SODIUM encryption (xchacha20_poly1305_aead)"; - "Dave encryption off" -> "SODIUM encryption (xchacha20_poly1305_aead)"; - "SODIUM encryption (xchacha20_poly1305_aead)" -> "UDP sendto"; + "AES AEAD encryption\nof OPUS stream\nusing ratchet" -> "XChaCha20-Poly1305 encryption"; + "Dave encryption off" -> "XChaCha20-Poly1305 encryption"; + "XChaCha20-Poly1305 encryption" -> "UDP sendto"; "UDP sendto" -> "Discord RTP server"; "DAVE enabled" -> "MLS send key package"; "MLS send key package" -> "MLS receive external sender"; diff --git a/docpages/building/freebsd.md b/docpages/building/freebsd.md index f8ca1a87e1..b6ec50ed99 100644 --- a/docpages/building/freebsd.md +++ b/docpages/building/freebsd.md @@ -12,21 +12,13 @@ pkg install cmake ## 2. Install Voice Dependencies (Optional) -If you wish to use voice support, you'll need to install opus and libsodium: +If you wish to use voice support, you'll need to install opus: -First, you need to install opus. ```bash cd /usr/ports/audio/opus make && make install ``` -Then, you need to install libsodium. - -```bash -cd /usr/ports/security/libsodium -make && make install -``` - ## 3. Build Source Code ```bash diff --git a/docpages/building/openbsd.md b/docpages/building/openbsd.md index a289d75f13..34953cccc9 100644 --- a/docpages/building/openbsd.md +++ b/docpages/building/openbsd.md @@ -15,7 +15,7 @@ pkg_add cmake If you wish to use voice support, you'll need to do the following: ```bash -pkg_add libsodium opus pkgconf +pkg_add opus ``` ## 3. Build Source Code diff --git a/docpages/building/osx.md b/docpages/building/osx.md index b43a99e9e1..059c77fca0 100644 --- a/docpages/building/osx.md +++ b/docpages/building/osx.md @@ -15,10 +15,10 @@ brew install openssl pkgconfig \note Usually, you do not need pkgconfig. However, it seems that it throws errors about openssl without. -For voice support, additional dependencies are required: +For voice support, additional dependency is required: ```bash -brew install libsodium opus +brew install opus ``` ## 3. Build Source Code diff --git a/docpages/images/audioframe.svg b/docpages/images/audioframe.svg index 302f65b0db..b17e104c49 100755 --- a/docpages/images/audioframe.svg +++ b/docpages/images/audioframe.svg @@ -173,7 +173,7 @@ sodipodi:role="line" id="tspan3010" x="748.91284" - y="835.92316">DAVE (AES 128 GCM AEAD) + y="835.92316">DAVE OPUS AUDIO (AES 128 GCM AEAD) SODIUM (CHACHA20 POLY1305) + y="912.60059">RTP CONTENT (CHACHA20 POLY1305 AEAD) __cdecl `int __cdecl main( 1>...\windows-bot-template-main\x64\Debug\MyBot.exe : fatal error LNK1120: 1 unresolved externals 1>Done building project "MyBot.vcxproj" -- FAILED. \endcode Make sure your don't have another version of the library installed through vcpkg. The template uses a slightly different version of D++ that has coroutines, while the vcpkg version does not, and the latter overwrites it! Uninstalling the library through vcpkg should fix this issue. -- If you get an error that a DLL is missing (e.g. `dpp.dll` or `opus.dll`) when starting your bot, then simply copy all DLLs from the **bin** directory of where you cloned the D++ repository to, into the same directory where your bot's executable is. You only need to do this once. There should be several of these DLL files: `dpp.dll`, `zlib.dll`, `openssl.dll` and `libcrypto.dll` (or similarly named SSL related files), `libsodium.dll` and `opus.dll`. Note the template project does this for you, so you should never encounter this issue. +- If you get an error that a DLL is missing (e.g. `dpp.dll` or `opus.dll`) when starting your bot, then simply copy all DLLs from the **bin** directory of where you cloned the D++ repository to, into the same directory where your bot's executable is. You only need to do this once. There should be several of these DLL files: `dpp.dll`, `zlib.dll`, `openssl.dll` and `libcrypto.dll` (or similarly named SSL related files), and `opus.dll`. Note the template project does this for you, so you should never encounter this issue. - If you get an error that says "Debug/Release mismatch", **you are using the wrong configuration of the D++ dll**. Your bot's executable and the dpp.dll file should both be built in the same configuration (Release or Debug), you get this error if they are different. **This also means you altered the template in a significant way,** we recommend you undo your modifications or reinstall the template. - Stuck? You can find us on the [official Discord server](https://discord.gg/dpp) - ask away! We don't bite! diff --git a/docpages/make_a_bot/windows_wsl.md b/docpages/make_a_bot/windows_wsl.md index 455073bb20..e09ea7400e 100644 --- a/docpages/make_a_bot/windows_wsl.md +++ b/docpages/make_a_bot/windows_wsl.md @@ -8,7 +8,7 @@ This tutorial teaches you how to create a lightweight environment for D++ develo 2. Now open PowerShell as Administrator and type `wsl` to start up your subsystem. You may also type `ubuntu` into your search bar and open it that way. 3. Head on over to your home directory using `cd ~`. 4. Download the latest build for your distro using `wget [url here]`. In this guide we will use the latest build for 64 bit Ubuntu: `wget -O libdpp.deb https://dl.dpp.dev/latest`. -5. Finally install all required dependencies and the library itself using `sudo apt-get install libopus0 libopus-dev libsodium-dev && sudo dpkg -i libdpp.deb && rm libdpp.deb`. +5. Finally install all required dependencies and the library itself using `sudo apt-get install libopus0 libopus-dev && sudo dpkg -i libdpp.deb && rm libdpp.deb`. 6. Congratulations, you've successfully installed all dependencies! Now comes the real fun: Setting up the environment! For this tutorial we'll use a as small as possible setup, so you might create a more advanced one for production bots. 7. Create a new directory, inside your home directory, using `mkdir MyBot`. Then, you want to open that directory using `cd MyBot`. 8. Now that you've a directory to work in, type `touch mybot.cxx` to create a file you can work in! diff --git a/include/dpp/cluster.h b/include/dpp/cluster.h index 0b6a980e65..5264d83d30 100644 --- a/include/dpp/cluster.h +++ b/include/dpp/cluster.h @@ -1321,7 +1321,7 @@ class DPP_EXPORT cluster { /** * @brief Called when packets are sent from the voice buffer. * The voice buffer contains packets that are already encoded with Opus and encrypted - * with Sodium, and merged into packets by the repacketizer, which is done in the + * with XChaCha20-Poly1305, and merged into packets by the repacketizer, which is done in the * dpp::discord_voice_client::send_audio method. You should use the buffer size properties * of dpp::voice_buffer_send_t to determine if you should fill the buffer with more * content. diff --git a/include/dpp/discordvoiceclient.h b/include/dpp/discordvoiceclient.h index 9edeef94fa..69e0abd7f8 100644 --- a/include/dpp/discordvoiceclient.h +++ b/include/dpp/discordvoiceclient.h @@ -134,7 +134,7 @@ enum dave_version_t : uint8_t { */ dave_version_none = 0, /** - * @brief DAVE enabled, version 1 (E2EE encryption on top of sodium) + * @brief DAVE enabled, version 1 (E2EE encryption on top of openssl) */ dave_version_1 = 1, }; @@ -685,12 +685,6 @@ class DPP_EXPORT discord_voice_client : public websocket_client */ class dpp::cluster* creator; - /** - * @brief This needs to be static, we only initialise libsodium once per program start, - * so initialising it on first use in a voice connection is best. - */ - static bool sodium_initialised; - /** * @brief True when the thread is shutting down */ @@ -865,7 +859,7 @@ class DPP_EXPORT discord_voice_client : public websocket_client * @param _session_id The voice session id to identify with * @param _host The voice server hostname to connect to (hostname:port format) * @param enable_dave Enable DAVE E2EE - * @throw dpp::voice_exception Sodium or Opus failed to initialise, or D++ is not compiled with voice support + * @throw dpp::voice_exception Opus failed to initialise, or D++ is not compiled with voice support * @warning DAVE E2EE is an EXPERIMENTAL feature! */ discord_voice_client(dpp::cluster* _cluster, snowflake _channel_id, snowflake _server_id, const std::string &_token, const std::string &_session_id, const std::string &_host, bool enable_dave = false); @@ -900,7 +894,7 @@ class DPP_EXPORT discord_voice_client : public websocket_client * * You should send an audio packet of `send_audio_raw_max_length` (11520) bytes. * Note that this function can be costly as it has to opus encode - * the PCM audio on the fly, and also encrypt it with libsodium. + * the PCM audio on the fly, and also encrypt it with openssl. * * @note Because this function encrypts and encodes packets before * pushing them onto the output queue, if you have a complete stream @@ -940,7 +934,7 @@ class DPP_EXPORT discord_voice_client : public websocket_client * Some containers such as .ogg may contain OPUS * encoded data already. In this case, we don't need to encode the * frames using opus here. We can bypass the codec, only applying - * libsodium to the stream. + * openssl to the stream. * * @param opus_packet Opus packets. Discord expects opus frames * to be encoded at 48000Hz @@ -968,7 +962,7 @@ class DPP_EXPORT discord_voice_client : public websocket_client * Some containers such as .ogg may contain OPUS * encoded data already. In this case, we don't need to encode the * frames using opus here. We can bypass the codec, only applying - * libsodium to the stream. + * opens to the stream. * * Duration is calculated internally * diff --git a/include/dpp/exception.h b/include/dpp/exception.h index 9584e8e86d..1c60084240 100644 --- a/include/dpp/exception.h +++ b/include/dpp/exception.h @@ -31,7 +31,7 @@ namespace dpp { * @brief Exception error codes possible for dpp::exception::code() * * This list is a combined list of Discord's error codes, HTTP error codes, - * zlib, opus, sodium and C library codes (e.g. DNS, socket etc). You may + * zlib, opus and C library codes (e.g. DNS, socket etc). You may * use these to easily identify a type of exception without having to resort * to string comparison against dpp::exception::what() * @@ -98,7 +98,6 @@ enum exception_error_code { err_no_voice_support = 29, err_invalid_voice_packet_length = 30, err_opus = 31, - err_sodium = 32, err_etf = 33, err_cache = 34, err_icon_size = 35, @@ -591,6 +590,8 @@ class exception : public std::exception derived_exception(file_exception, exception); derived_exception(connection_exception, exception); derived_exception(voice_exception, exception); + derived_exception(encryption_exception, voice_exception); + derived_exception(decryption_exception, voice_exception); derived_exception(rest_exception, exception); derived_exception(invalid_token_exception, rest_exception); derived_exception(length_exception, exception); diff --git a/include/dpp/utility.h b/include/dpp/utility.h index 0dcb974972..6654606fc3 100644 --- a/include/dpp/utility.h +++ b/include/dpp/utility.h @@ -574,7 +574,7 @@ double DPP_EXPORT time_f(); /** * @brief Returns true if D++ was built with voice support * - * @return bool True if voice support is compiled in (libsodium/libopus) + * @return bool True if voice support is compiled in (libopus) */ bool DPP_EXPORT has_voice(); diff --git a/library-vcpkg/CMakeLists.txt b/library-vcpkg/CMakeLists.txt index 0d7d0ac995..3148b6163d 100644 --- a/library-vcpkg/CMakeLists.txt +++ b/library-vcpkg/CMakeLists.txt @@ -108,7 +108,6 @@ target_link_options( find_package(nlohmann_json CONFIG REQUIRED) find_package(OpenSSL REQUIRED) find_package(Opus CONFIG REQUIRED) -find_package(unofficial-sodium CONFIG REQUIRED) find_package(ZLIB REQUIRED) target_link_libraries( @@ -117,7 +116,6 @@ target_link_libraries( $<$:OpenSSL::SSL> $<$:OpenSSL::Crypto> $<$:Opus::opus> - $<$:unofficial-sodium::sodium> $<$:ZLIB::ZLIB> $<$:Threads::Threads> ) diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 5d328f295c..0cabd74161 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -63,17 +63,12 @@ if(WIN32 AND NOT MINGW) link_libraries("${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/libssl.lib") link_libraries("${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/libcrypto.lib") link_libraries("${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/zlib.lib") - link_libraries("${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/libsodium.lib") link_libraries("${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/opus.lib") set(OPUS_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/../win32/include") set(OPUS_LIBRARIES "${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/opus.lib") - set(sodium_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../win32/include") - set(sodium_LIBRARY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/libsodium.lib") - set(sodium_LIBRARY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/libsodium.lib") set(HAVE_OPUS_OPUS_H "${CMAKE_CURRENT_SOURCE_DIR}/../win32/include/opus/opus.h") set(OPUS_FOUND 1) - SET(sodium_VERSION_STRING "win32 bundled") include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../win32/include") @@ -123,7 +118,6 @@ if(NOT BUILD_SHARED_LIBS) endif() set(OPENSSL_USE_STATIC_LIBS ON) - set(sodium_USE_STATIC_LIBS ON) set(OPUS_USE_STATIC_LIBS TRUE) else() message(WARNING "-- Building of static library not supported on non UNIX systems.") @@ -132,30 +126,19 @@ endif() if (BUILD_VOICE_SUPPORT) if (MINGW OR NOT WIN32) - find_package(PkgConfig QUIET) - if(PKG_CONFIG_FOUND) - include("${CMAKE_CURRENT_SOURCE_DIR}/../cmake/FindSodium.cmake") - else() - message("-- Could not detect ${Green}libsodium${ColourReset} due to missing ${Green}pkgconfig${ColourReset}. VOICE support will be ${Red}disabled${ColourReset}") - endif() - include("${CMAKE_CURRENT_SOURCE_DIR}/../cmake/FindOpus.cmake") + include("${CMAKE_CURRENT_SOURCE_DIR}/../cmake/FindOpus.cmake") endif() - if(DEFINED OPUS_FOUND) + if(HAVE_OPUS_OPUS_H) message("-- Found Opus ${Green}${OPUS_LIBRARIES}${ColourReset}") - if((WIN32 OR PKG_CONFIG_FOUND) AND DEFINED sodium_VERSION_STRING AND DEFINED sodium_LIBRARY_RELEASE) - add_compile_definitions(HAVE_VOICE) - - message("-- Sodium ${Green}${sodium_VERSION_STRING}${ColourReset}") - - set(HAVE_VOICE 1) - endif() + add_compile_definitions(HAVE_VOICE) + set(HAVE_VOICE 1) endif() if(HAVE_VOICE) - message("-- Detected ${Green}libsodium${ColourReset} and ${Green}libopus${ColourReset}. VOICE support will be ${Green}enabled${ColourReset}") + message("-- Detected ${Green}libopus${ColourReset}. VOICE support will be ${Green}enabled${ColourReset}") else(HAVE_VOICE) - message("-- Could not detect ${Green}libsodium${ColourReset} and/or ${Green}libopus${ColourReset}. VOICE support will be ${Red}disabled${ColourReset}") + message("-- Could not detect ${Green}libopus${ColourReset}. VOICE support will be ${Red}disabled${ColourReset}") endif(HAVE_VOICE) else() message("-- Voice support disabled by cmake option") @@ -275,13 +258,11 @@ foreach (fullmodname ${subdirlist}) if (NOT WINDOWS_32_BIT) target_link_libraries(${modname} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/libssl.lib" "${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/libcrypto.lib" - "${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/libsodium.lib" "${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/opus.lib" "${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/zlib.lib") else() target_link_libraries(${modname} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../win32/32/lib/libssl.lib" "${CMAKE_CURRENT_SOURCE_DIR}/../win32/32/lib/libcrypto.lib" - "${CMAKE_CURRENT_SOURCE_DIR}/../win32/32/lib/libsodium.lib" "${CMAKE_CURRENT_SOURCE_DIR}/../win32/32/lib/opus.lib" "${CMAKE_CURRENT_SOURCE_DIR}/../win32/32/lib/zlib.lib") endif() @@ -305,9 +286,8 @@ foreach (fullmodname ${subdirlist}) endif() if (HAVE_VOICE) - target_link_libraries(${modname} PUBLIC ${sodium_LIBRARY_RELEASE} ${OPUS_LIBRARIES}) - - include_directories(${OPUS_INCLUDE_DIRS} ${sodium_INCLUDE_DIR}) + target_link_libraries(${modname} PUBLIC ${OPUS_LIBRARIES}) + include_directories(${OPUS_INCLUDE_DIRS}) endif() endforeach() @@ -425,13 +405,11 @@ if(WIN32 AND NOT MINGW) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/bin/zlib1.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/bin/libcrypto-1_1-x64.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/bin/libssl-1_1-x64.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY) - configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/bin/libsodium.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/bin/opus.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY) else() configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/32/bin/zlib1.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/32/bin/libcrypto-1_1.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/32/bin/libssl-1_1.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY) - configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/32/bin/libsodium.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/32/bin/opus.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY) endif() endif() diff --git a/src/davetest/dave.cpp b/src/davetest/dave.cpp index 719dd1e06b..94812e0d89 100644 --- a/src/davetest/dave.cpp +++ b/src/davetest/dave.cpp @@ -71,6 +71,9 @@ int main() { if (v && v->is_ready()) { v->send_audio_raw((uint16_t*)testaudio.data(), testaudio.size()); } + dave_test.start_timer([v, &testaudio](auto) { + v->send_audio_raw((uint16_t*)testaudio.data(), testaudio.size()); + }, 15); }); diff --git a/src/dpp/discordvoiceclient.cpp b/src/dpp/discordvoiceclient.cpp index ca44b19c06..64e1598247 100644 --- a/src/dpp/discordvoiceclient.cpp +++ b/src/dpp/discordvoiceclient.cpp @@ -68,8 +68,6 @@ moving_averager::operator float() { return 0.0f; } -bool discord_voice_client::sodium_initialised = false; - discord_voice_client::~discord_voice_client() { cleanup(); diff --git a/src/dpp/voice/enabled/audio_mix.cpp b/src/dpp/voice/enabled/audio_mix.cpp index a411623f6d..6d0f128e8c 100644 --- a/src/dpp/voice/enabled/audio_mix.cpp +++ b/src/dpp/voice/enabled/audio_mix.cpp @@ -29,8 +29,6 @@ #include #include #include - -#include #include namespace dpp { diff --git a/src/dpp/voice/enabled/constructor.cpp b/src/dpp/voice/enabled/constructor.cpp index 1e0a20b8f3..fc8e16d0d5 100644 --- a/src/dpp/voice/enabled/constructor.cpp +++ b/src/dpp/voice/enabled/constructor.cpp @@ -26,11 +26,8 @@ #include #include #include - -#include #include #include "../../dave/encryptor.h" - #include "enabled.h" namespace dpp { @@ -64,12 +61,6 @@ discord_voice_client::discord_voice_client(dpp::cluster* _cluster, snowflake _ch server_id(_server_id), channel_id(_channel_id) { - if (!discord_voice_client::sodium_initialised) { - if (sodium_init() < 0) { - throw dpp::voice_exception(err_sodium, "discord_voice_client::discord_voice_client; sodium_init() failed"); - } - discord_voice_client::sodium_initialised = true; - } int opusError = 0; encoder = opus_encoder_create(opus_sample_rate_hz, opus_channel_count, OPUS_APPLICATION_VOIP, &opusError); if (opusError) { diff --git a/src/dpp/voice/enabled/enabled.h b/src/dpp/voice/enabled/enabled.h index 78b55958d5..ef821f8d66 100644 --- a/src/dpp/voice/enabled/enabled.h +++ b/src/dpp/voice/enabled/enabled.h @@ -52,7 +52,6 @@ #include #include #include -#include #include #include "../../dave/session.h" #include "../../dave/decryptor.h" @@ -99,7 +98,7 @@ struct rtp_header { }; /** -* @brief Transport encryption type (libsodium) +* @brief Transport encryption type (libssl) */ constexpr std::string_view transport_encryption_protocol = "aead_xchacha20_poly1305_rtpsize"; @@ -108,3 +107,48 @@ std::string generate_displayable_code(const std::vector &data, size_t d size_t audio_mix(discord_voice_client &client, audio_mixer &mixer, opus_int32 *pcm_mix, const opus_int16 *pcm, size_t park_count, int samples, int &max_samples); } + +/** + * @brief OpenSSL based reimplementation of sodium's crypto_aead_xchacha20poly1305_ietf_encrypt + * @note Parameters and types are intended to match sodium as to be a drop-in replacement. + * @param c Ciphertext + Tag output + * @param clen Ciphertext length output + * @param m Message (plaintext) input + * @param mlen Message length + * @param ad Additional authenticated data (AAD) + * @param adlen Authenticated data length + * @param nsec Secret nonce (optional, nullptr to not use) + * @param npub Public nonce (24 bytes) + * @param k Key (32 bytes) + * @return 0 on success, -1 on error + */ +int ssl_crypto_aead_xchacha20poly1305_ietf_encrypt(unsigned char *c, unsigned long long *clen, const unsigned char *m, unsigned long long mlen, const unsigned char *ad, unsigned long long adlen, const unsigned char *nsec, const unsigned char *npub, const unsigned char *k); + +/** + * @brief OpenSSL based reimplementation of sodium's crypto_aead_xchacha20poly1305_ietf_decrypt + * @note Parameters and types are intended to match sodium as to be a drop-in replacement. + * @param m Message (plaintext) output + * @param mlen message length output + * @param nsec Secret nonce (optional, nullptr to not use) + * @param c Ciphertext + Tag input + * @param clen Ciphertext length + * @param ad Additional authenticated data (AAD) + * @param adlen Additional authenticated data length + * @param npub Public nonce (24 bytes) + * @param k Key (32 bytes) + * @return 0 on success, -1 on error + */ +int ssl_crypto_aead_xchacha20poly1305_ietf_decrypt(unsigned char *m, unsigned long long *mlen, unsigned char *nsec, const unsigned char *c, unsigned long long clen, const unsigned char *ad, unsigned long long adlen, const unsigned char *npub, const unsigned char *k); + +/** + * @brief Size of public nonce (24 bytes) + * @note This constant is a drop-in replacement for one in libsodium + */ +inline constexpr unsigned int ssl_crypto_aead_xchacha20poly1305_ietf_NPUBBYTES = 24U; + +/** + * @brief AAD size + * @note This constant is a drop-in replacement for one in libsodium + */ +inline constexpr unsigned int ssl_crypto_aead_xchacha20poly1305_IETF_ABYTES = 16U; + diff --git a/src/dpp/voice/enabled/handle_frame.cpp b/src/dpp/voice/enabled/handle_frame.cpp index 5ade5ac4f0..060fb9692f 100644 --- a/src/dpp/voice/enabled/handle_frame.cpp +++ b/src/dpp/voice/enabled/handle_frame.cpp @@ -363,6 +363,8 @@ bool discord_voice_client::handle_frame(const std::string &data, ws_opcode opcod auto key_response = mls_state->dave_session->get_marshalled_key_package(); key_response.insert(key_response.begin(), voice_client_dave_mls_key_package); this->write(std::string_view(reinterpret_cast(key_response.data()), key_response.size()), OP_BINARY); + } else { + ready_now = true; } if (ready_now) { diff --git a/src/dpp/voice/enabled/opus.cpp b/src/dpp/voice/enabled/opus.cpp index 066cacdb53..9f8aaeaff9 100644 --- a/src/dpp/voice/enabled/opus.cpp +++ b/src/dpp/voice/enabled/opus.cpp @@ -24,7 +24,6 @@ #include #include #include - #include #include "../../dave/array_view.h" #include "../../dave/encryptor.h" @@ -115,9 +114,10 @@ discord_voice_client& discord_voice_client::send_audio_opus(uint8_t* opus_packet rtp_header header(sequence, timestamp, (uint32_t)ssrc); /* Expected payload size is unencrypted header + encrypted opus packet + unencrypted 32 bit nonce */ - size_t packet_siz = sizeof(header) + (encoded_audio_length + crypto_aead_xchacha20poly1305_IETF_ABYTES) + sizeof(packet_nonce); + size_t packet_siz = sizeof(header) + (encoded_audio_length + ssl_crypto_aead_xchacha20poly1305_IETF_ABYTES) + sizeof(packet_nonce); std::vector payload(packet_siz); + std::vector payload2(packet_siz); /* Set RTP header */ std::memcpy(payload.data(), &header, sizeof(header)); @@ -126,13 +126,14 @@ discord_voice_client& discord_voice_client::send_audio_opus(uint8_t* opus_packet uint32_t noncel = htonl(packet_nonce); /* 24 byte is needed for encrypting, discord just want 4 byte so just fill up the rest with null */ - unsigned char encrypt_nonce[crypto_aead_xchacha20poly1305_ietf_NPUBBYTES] = { '\0' }; + unsigned char encrypt_nonce[ssl_crypto_aead_xchacha20poly1305_ietf_NPUBBYTES] = { '\0' }; memcpy(encrypt_nonce, &noncel, sizeof(noncel)); - /* Execute */ - crypto_aead_xchacha20poly1305_ietf_encrypt( + /* Execute */ + unsigned long long int clen{0}; + if (ssl_crypto_aead_xchacha20poly1305_ietf_encrypt( payload.data() + sizeof(header), - nullptr, + &clen, encoded_audio.data(), encoded_audio_length, /* The RTP Header as Additional Data */ @@ -141,7 +142,9 @@ discord_voice_client& discord_voice_client::send_audio_opus(uint8_t* opus_packet nullptr, static_cast(encrypt_nonce), secret_key.data() - ); + ) != 0) { + log(dpp::ll_debug, "XChaCha20 Encryption failed"); + } /* Append the 4 byte nonce to the resulting payload */ std::memcpy(payload.data() + payload.size() - sizeof(noncel), &noncel, sizeof(noncel)); diff --git a/src/dpp/voice/enabled/read_ready.cpp b/src/dpp/voice/enabled/read_ready.cpp index 51a817fbed..95ac598160 100644 --- a/src/dpp/voice/enabled/read_ready.cpp +++ b/src/dpp/voice/enabled/read_ready.cpp @@ -120,7 +120,7 @@ void discord_voice_client::read_ready() uint8_t decrypted[65535] = { 0 }; unsigned long long opus_packet_len = 0; - if (crypto_aead_xchacha20poly1305_ietf_decrypt( + if (ssl_crypto_aead_xchacha20poly1305_ietf_decrypt( decrypted, &opus_packet_len, nullptr, ciphertext, ciphertext_len, diff --git a/src/dpp/voice/enabled/xchacha20.cpp b/src/dpp/voice/enabled/xchacha20.cpp new file mode 100644 index 0000000000..cff2cc1eb9 --- /dev/null +++ b/src/dpp/voice/enabled/xchacha20.cpp @@ -0,0 +1,234 @@ +/************************************************************************************ + * + * D++, A Lightweight C++ library for Discord + * + * SPDX-License-Identifier: Apache-2.0 + * Copyright 2021 Craig Edwards and D++ contributors + * (https://github.com/brainboxdotcc/DPP/graphs/contributors) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Contains macros from BoringSSL, Copyright (c) 2014, Google Inc. + * Adapted from the public domain, estream code by D. Bernstein. + * + ************************************************************************************/ + +#include +#include +#include +#include +#include "enabled.h" + +/** + * @brief ChaCha static constant + * For some reason this is the ASCII string 'expand 32-byte k'. + * It is specified by the standard, and cannot be changed. + */ +constexpr uint8_t CHACHA20_CONSTANT_SEED[16] = {'e', 'x', 'p', 'a', 'n', 'd', ' ', '3', '2', '-', 'b', 'y', 't', 'e', ' ', 'k' }; + +/** + * XChaCha20-Poly1305 key size + */ +constexpr size_t KEY_SIZE = 32; + +/** + * @brief ChaCha20-Poly1305 nonce size + */ +constexpr size_t CHACHA_NONCE_SIZE = 12; + +/** + * @brief Rotates the bits of a 32-bit unsigned integer to the left by a specified number of positions. + * @note From Google's BoringSSL, but made constexpr + * + * @param value value to shift + * @param shift number of bits to shift left by + * @return shifted value + */ +constexpr uint32_t rotl_u32(uint32_t value, int shift) { + return (value << shift) | (value >> ((-shift) & 31)); +} + +/** + * @brief Updates a, b, c, and d with a ChaCha20 quarter round. + * @note This is based on black box voodoo from BoringSSL. + * + * @param x an array forming part of an XChaCha20 nonce + * @param a First word of the quarter-round. + * @param b Second word of the quarter-round. + * @param c Third word of the quarter-round. + * @param d Fourth word of the quarter-round. + */ +constexpr void quarter_round(uint32_t* x, int a, int b, int c, int d) { + x[a] += x[b]; + x[d] = rotl_u32(x[d] ^ x[a], 16); + x[c] += x[d]; + x[b] = rotl_u32(x[b] ^ x[c], 12); + x[a] += x[b]; + x[d] = rotl_u32(x[d] ^ x[a], 8); + x[c] += x[d]; + x[b] = rotl_u32(x[b] ^ x[c], 7); +} + +/** + * @brief key derivation function that takes a 256-bit key and a 128-bit nonce, producing a 256-bit subkey. + * + * This subkey is then used in the XChaCha20 algorithm to extend the nonce size to 192 bits. + * @note This based on the function from BoringSSL. Do not mess with it. + * @param out output 32 byte subkey + * @param key input 32 byte key + * @param nonce input 16 byte nonce + */ +void hchacha20(unsigned char out[KEY_SIZE], const unsigned char key[KEY_SIZE], const unsigned char nonce[16]) { + uint32_t x[16]; + std::memcpy(x, CHACHA20_CONSTANT_SEED, sizeof(CHACHA20_CONSTANT_SEED)); + std::memcpy(&x[4], key, KEY_SIZE); + std::memcpy(&x[CHACHA_NONCE_SIZE], nonce, 16); + for (size_t i = 0; i < 20; i += 2) { + quarter_round(x, 0, 4, 8, 12); + quarter_round(x, 1, 5, 9, 13); + quarter_round(x, 2, 6, 10, 14); + quarter_round(x, 3, 7, 11, 15); + quarter_round(x, 0, 5, 10, 15); + quarter_round(x, 1, 6, 11, 12); + quarter_round(x, 2, 7, 8, 13); + quarter_round(x, 3, 4, 9, 14); + } + std::memcpy(out, &x[0], sizeof(uint32_t) * 4); + std::memcpy(&out[16], &x[CHACHA_NONCE_SIZE], sizeof(uint32_t) * 4); +} + +int ssl_crypto_aead_xchacha20poly1305_ietf_encrypt(unsigned char *c, unsigned long long *clen, const unsigned char *m, unsigned long long mlen, const unsigned char *ad, unsigned long long adlen, const unsigned char *nsec, const unsigned char *npub, const unsigned char *k) { + unsigned char sub_key[KEY_SIZE]; + /* Regular ChaCha20-Poly1305 uses 12-byte nonce */ + unsigned char chacha_nonce[CHACHA_NONCE_SIZE] = {0}; + EVP_CIPHER_CTX *ctx = nullptr; + int len = 0; + int ciphertext_len = 0; + + try { + /* Derive the sub-key using HChaCha20 */ + hchacha20(sub_key, k, npub); + + /* Use the last 8 bytes of the 24-byte XChaCha20 nonce */ + std::memcpy(chacha_nonce + 4, npub + ssl_crypto_aead_xchacha20poly1305_IETF_ABYTES, 8); + + /* Initialize encryption context with ChaCha20-Poly1305 */ + ctx = EVP_CIPHER_CTX_new(); + if ((ctx == nullptr) || (EVP_EncryptInit_ex(ctx, EVP_chacha20_poly1305(), nullptr, nullptr, nullptr) == 0)) { + throw dpp::encryption_exception("Error initializing encryption context"); + } + + /* Set key and nonce */ + if (EVP_EncryptInit_ex(ctx, nullptr, nullptr, sub_key, chacha_nonce) == 0) { + throw dpp::encryption_exception("Error setting key and nonce"); + } + + /* Set additional authenticated data (AAD) */ + if (EVP_EncryptUpdate(ctx, nullptr, &len, ad, static_cast(adlen)) == 0) { + throw dpp::encryption_exception("Error setting additional authenticated data"); + } + + /* Encrypt the plaintext */ + if (EVP_EncryptUpdate(ctx, c, &len, m, static_cast(mlen)) == 0) { + throw dpp::encryption_exception("Error during encryption"); + } + ciphertext_len = len; + + if (EVP_EncryptFinal_ex(ctx, c + len, &len) == 0) { + throw dpp::encryption_exception("Error finalizing encryption"); + } + ciphertext_len += len; + + /* Get the authentication tag */ + if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, ssl_crypto_aead_xchacha20poly1305_IETF_ABYTES, c + ciphertext_len) == 0) { + throw dpp::encryption_exception("Error getting authentication tag"); + } + + /* Total ciphertext length (ciphertext + tag) */ + if (clen != nullptr) { + *clen = ciphertext_len + ssl_crypto_aead_xchacha20poly1305_IETF_ABYTES; + } + + } catch (const dpp::encryption_exception& e) { + EVP_CIPHER_CTX_free(ctx); + return -1; + } + + EVP_CIPHER_CTX_free(ctx); + return 0; +} + +int ssl_crypto_aead_xchacha20poly1305_ietf_decrypt(unsigned char *m, unsigned long long *mlen, [[maybe_unused]] unsigned char *nsec, const unsigned char *c, unsigned long long clen, const unsigned char *ad, unsigned long long adlen, const unsigned char *npub, const unsigned char *k) { + unsigned char sub_key[KEY_SIZE]; + /* Regular ChaCha20-Poly1305 uses 12-byte nonce */ + unsigned char chacha_nonce[CHACHA_NONCE_SIZE] = {0}; + EVP_CIPHER_CTX *ctx = nullptr; + int len = 0; + int plaintext_len = 0; + + if (clen < ssl_crypto_aead_xchacha20poly1305_IETF_ABYTES) { + /* Ciphertext length must include at least the tag (16 bytes) */ + return -1; + } + + try { + /* Derive the sub-key using HChaCha20 */ + hchacha20(sub_key, k, npub); + + /* Use the last 8 bytes of the 24-byte XChaCha20 nonce */ + std::memcpy(chacha_nonce + 4, npub + ssl_crypto_aead_xchacha20poly1305_IETF_ABYTES, 8); + + /* Initialize decryption context with ChaCha20-Poly1305 */ + ctx = EVP_CIPHER_CTX_new(); + if (!ctx || (EVP_DecryptInit_ex(ctx, EVP_chacha20_poly1305(), nullptr, nullptr, nullptr) == 0)) { + throw dpp::decryption_exception("Error initializing decryption context"); + } + + /* Set key and nonce */ + if (EVP_DecryptInit_ex(ctx, nullptr, nullptr, sub_key, chacha_nonce) == 0) { + throw dpp::decryption_exception("Error setting key and nonce"); + } + + /* Set additional authenticated data (AAD) */ + if (EVP_DecryptUpdate(ctx, nullptr, &len, ad, static_cast(adlen)) == 0) { + throw dpp::decryption_exception("Error setting additional authenticated data"); + } + + /* Decrypt the ciphertext (excluding the tag) */ + if (EVP_DecryptUpdate(ctx, m, &len, c, static_cast(clen - ssl_crypto_aead_xchacha20poly1305_IETF_ABYTES)) == 0) { + throw dpp::decryption_exception("Error during decryption"); + } + plaintext_len = len; + + /* Set the expected tag */ + if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, ssl_crypto_aead_xchacha20poly1305_IETF_ABYTES, const_cast(c + clen - ssl_crypto_aead_xchacha20poly1305_IETF_ABYTES)) == 0) { + throw dpp::decryption_exception("Error setting authentication tag"); + } + + /* Check tag */ + int ret = EVP_DecryptFinal_ex(ctx, m + len, &len); + if (ret > 0) { + /* Tag is valid, finalize plaintext length */ + *mlen = plaintext_len + len; + } else { + throw dpp::decryption_exception("Authentication failed"); + } + + } catch (const dpp::decryption_exception& e) { + EVP_CIPHER_CTX_free(ctx); + return -1; + } + + EVP_CIPHER_CTX_free(ctx); + return 0; +} diff --git a/vcpkg/ports/dpp/vcpkg.json b/vcpkg/ports/dpp/vcpkg.json index cc9cc114f3..743b89dd0b 100644 --- a/vcpkg/ports/dpp/vcpkg.json +++ b/vcpkg/ports/dpp/vcpkg.json @@ -6,7 +6,6 @@ "license": "Apache-2.0", "supports": "(windows & !static & !uwp) | linux | osx", "dependencies": [ - "libsodium", "nlohmann-json", "openssl", "opus", diff --git a/win32/32/bin/libsodium.dll b/win32/32/bin/libsodium.dll deleted file mode 100755 index 09d2e51792f4ce5c526be8ae54ea9b25566ace22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336896 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

G3H=_ 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 diff --git a/win32/bin/libsodium.dll b/win32/bin/libsodium.dll deleted file mode 100644 index 0fc90b12317a48943978c179dbae522cb3395765..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 330752 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 z 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 z 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�>V1G4zco_7i$?4B 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⪼cCtk{Pm67I!`cD>Vpyw z0f9gMCFcp251}?vODR;H^91K(Yn>;EFcJ&iaH*``^90||_muNreV$;jR4(=Z|9OHB z?(=u7HGY}EgRTj!JQas!O2`{SuC^xA!w;k1q90qp#-Q#6upE* z(YlltB#G9g43&atU5Y6Ru6SBJ))qqpz}G@~kSdRc`&*$y2;v1x8HT|dq|&N9dbf~7 z|FKkhJo@U4DIxekkO+B%5C&yH!!*PfiR2;P5GKpAB^V*dVoRnkL`(Q?EKxmImyreO zad1vZpGokH(K$@-B>$A)NSNyWJ))8B9SkBu5-nAEq}Zx3L`ymJl3H?T923P#)1j&X zcMGCRgeq?g|58ef6)E6BC{2QA68WUq%HY7{;0YlOzJN?^t0<0GHDeu@@t#AVoPu}3 zQ4~m{5%@FwN6aTDW^NhTv^s^Eo=Ii3Ibg-1Zn8tgLxrwpd_-=z=Y;QVN}q)^N=)2@ zY_eYI^AbWrovGeL`b=O{0Vd*N7OG0B|0ku-OEA=5Cd%DZ`b=2fTKYVG6-6ln{e-AB z4;E4I7ATPrJx_)X5>;SHi)CabSFkmcMxp3QET)B&oFJh7INSZXU_=WNK1^UbK9JaGSJV!K)5gG2<7JaGD*E3BKe> zp(0CAk2v!tvS(3g0*6}(p9wU8mH>k(_z)QY^QNNbCGMJ4C;V8NprU2PipGbk&!7ga z7KK;{+dsNWhy_s;(3BVmKWgPSl|8F$2)tA-^2nYusYd`U5pcV*XVL$FbyUIfe@pf} zWfk%ju!sOR6+9CwN(L9?tWWT4!}HW;DRri;6;f3WPJlquC7449oQ1w}k~ZTQAfkvZ z2(`C%4+|;FmJmh$36f^X$kcR&-hG)Z$vbaL(3}ngUFjvL<@!a;xQvCN0O6{fHUzeF zsvz^E6lB(xhXaoV4it?Ls87Z`B^h}ETi29Kf#dB8nB|aCd82?C5_}=%cUk5GuUko% z#hB}sE|(GcQQI_R-ym9^QYO&X<6Bp*EVlD*PpE7mIqn}wlxZ6>rIt9^Qbh~}3Q1Wq zW(~I^NT#XCKTV2^8H{`eW4x%w8|BBt+&X$_3s>mqNrc5qqWl#}lyL#J4BoXR%ii|` z{x13Q*;~n%|0AzLw?;bCMYj$S5;e-3$(8>P$*btaFCnjjl!~?@T(lJdp%tV@MI;** zPo+SL3>h%wUa3{RNs0^+5QZU=Q9*i?2bnUNxKa+mGSZd)ku=#+zcjh*meS<%A;=Lj z?SEK|ocAWsmSSWSW=M?`S(my6CHrp(k)IWO}s0-EzeSk`ylciapZV_TOm8mZIcThma5#p;4qB zA^y*X22BRj-ddXOcRo_7-N=TQ>J({8AyqaYl9Vb3smZPbc5Zf+oD|H?){{4S1@VG9 zB*~#N+OlwIuB7|N$Zf%8N&peGP@N+7Qa8irCX(dk2!bS;GVzimlT%2N6|#80BQT$) zAHD%@;W327!2&^&A5(~UYNAGd>=mTSk0E{5k}pLLYJf_iWEAEtKXym(^@?z__XD6m zOJKnBO+A3ujq+mx=Ij(H<^*m@PNZA513g+&+7s!P|3pfO5b4o!V4^^Jv`WN;LCTUa zu~4Nzie1Q%AZQZC80emhO{_+p%=JInQ%F_J`-)wRd;z>#5eR22Q%T0>}E1?M|O+2;;h4M z*LJvnD(*LbgG_M0`FpSX&GF(w=16n`G|4Rj*IVtg`zOF&0=rFdd0mM08Xx5~PaUqc zevd1TyPQ81|4#Q|8@unr?yCPj>@KhSut%+mdLI`17`JyH78|gYwxhVwS>JtFIv8N% z2=v^CEmH5p7JA=@Ep*>+-I`-7a@&h@Y+K#-Z8^4Lw|#q#ZJXP^BgeK~*mG<?xi`#$Wh8}GyJy7hfn1mF5TEKyv&LRR|iki(mC_s5>4xF+M~OGhF0HwSmzVyi^bNEXMd<({Q=KE=Wb#D&iVri z|JVCRU{I%j{3P1De++2vsl-#x>w540v3tjx^^c2Dy;OlW>mR>Och}zkvHo%MfBHun zP;R0xz^i}U^q>CmbKLb_j|PRI*rs#-1ujqjxChOy-u^Kz!n=Po4jW0g@o}e2`}B0R zNkMuKjnVOnRAh4{L2-x++}MZ2XzmR7@^_wK9{{x!`xETA7*85Q9#~5YYKVTRXC6g4 zXKhM+>``ccH4YmgGMI=A{5=`qA&o=viZcP)hgON&hQ^#LG6Tvh%DMClY6sAZn4oNy zdUNc9Da#sF1C;Ft>twcxlJX08WdL!I#;*CY7UBoRFa=;=S6bQ;79#u zZG8=HMGa2Ust9U%tLhQyyy=ycdi(S;1M7O~>qdH2Z1gHh6pC`XrMoDi8e7StxT}$L zV}*mOq0BD?iW>Z>$T(>diidCzfMYa48t6rV-QNrqhJjlV9V#d;hrGBSN{ak>5p=s` zm1%g9``pMs2v7e{hG)DPJmWCbm=TTT$kZC*L-7e}orhK7;DQo-HBG}zYZ+$fg_Z#?=Q zu#?fN=R1{+!6=RT3Q2zQD!m%`5 zFhW*OWsEu0}_?QPz1MQW|f<7Cqx>KT7as^u09%tZ6Q2DOs^BeYV=Z=EtJOsRbcN zcLS0wt^P)|1uKoLzNM3hVxC6Sr3p2n?eHzseu*zay&BQd7HT8%!5ddl^rj-_8;wA7Zq*$1wH^K;u zR=^VhjM$`xik=}uZC`0Fpw`U!ok{8+R@_Q=QtRjchN(ncjU`l&LAaoOdB-1p862 zVhy3xjW~32YJa0hS(_qj6cedM5b(14?nN+5?*eFpCA3X2oJZ09AnjW6QlT}JK#q|? z7^(OypeWf6flng|;bnsGo`mqM7X*pVljI}tQ57Az@yQL2N07U?Zuq?@I^eeihM!J^ zJy+WSUd|sS{5vSPUJR*zLPk>6Bq-WSN@?#k5r%RI^_||)n%nCzT+WL^^_F%g?D60Q zWCgmFAj!AVC!BnA=m@|EXla}DQ14fkb*;gSV46X?{R%L}fa<-d>Vwg{t1l>5abC-v zOB&_!y3B?0ubs)mm)#twXm>uPVbB0c zI;(W%yj<;faC>59^<4=!OA9X4{)H^~18p(=D?7ZEV6%ytNH;9dc5DttwJ z$;dARVw9m);cRq=+B7G^OY-uK4TShZ(RKk0503VsKDpZFl$n^i=7p(n^aL7HST}D` z8ByO`^S$~j!WTmsMlqV1_+zqc8g3e)4rqF1g;35J&6Um3N3zPUSfVdkqR&QOvME<= zN*PWY;*??5WlfsS`E>xbM`(ObKLRQ*{X`J~hF}Ds$mITF8w)2rPo5 zKjd0)tg9}KD1uo6^}6eNOP~n1Lq~17KZUJ*M0n;QJTME z1~j6gQ{G8G$PE2_FurmB>CN$`wZAR){EW^D6p!xO;~bFV+cutWvGRiW*rPK#f*WRf zYN$2*d$j-#=m}+PPZ=-D-lEI?5_U`WSzY$$uw0Ug zTN|XCtfiG{y;c2k$VQhn8^Lk9??NN8uJ%pWTKTSuriA`5!o9hQ`vbtqn$6R9f}to- zPYAY}FOpHb%J#C1{u1};C#{OA-yMDMeS_@25!PHyg@uO&)SwUUEM#aztYQxjy8t1O zERQT30xP~n9%)T^*a3vOOHA>tSO!v+6HR>*axss?Av_b9811jl1Ik|QJ6}1BCV>V{ zEkNu1vLR!o71p(XTQ2{s)u*z4*3g5zrKhWp&|-;(JbTbX30?E7T|weJA8SP3I_&&1 zYuBQ9EOJYo@qrGk7Oc9@A+q#cK%^)6s&_BoX|Hvfs##fT$V7tZBPL~&O>qJ>w9*76 zA6i$H3rdA@jnE8m1_I3l@WDh6rt!+I`07(Y6PZ4gU~f(LD_8$ z@4`q`K-$Hve6!DG+y?Q}y-batB3iR5{LBh;lWsHZIc>^1-rr=8yKb?^<%^EM{?K-F z2L}{lSnPvNLM7ZK^bcso9ndih8fa4Tv#R=w)^n-E@R&IOjR`*eOqu!UO)MQs(fAQ? z7X_f1Un=QP)S=iMkY@?Ve;~*AUMrdjp^`NVEg?R(QulHqEaI+LE=sWug=Af}?Kzco zs=s~Ub+dh-K*|2FiV?6e+aEkxgOO5L2O09{=f;kZC~pF=H>1b=o6*CfpdZUe&(sg_ zQ7-gP)J56{p$Y^xGlc-LR;h(?C(q$ z1AS^dy22aVv3tB1?b)NxSWG&jxm66%C~1aJUhK3ghZ16oW;7aX_icn>`#G(16D?@7 zFQq*K5rFUAc%T8b;G1GJ}uI-u`Z?L08GHP-44FrF)$ z5^{|g!4olnTm3P3QxUAz+$6mv`WI_%YFUpX*4&u~jXf?Udsnpw8l;1FT zo0RJo<+`|Za0DDjgfO~?Zn2(1@j~epg?#*qQCCMzndhQRna=xANu~G|Wt|QH_Rw#d zm3JvR50OyHfTDCg_30Dm9!Z~w$E>M8Z->=8^{-PzPf-zRLZj_a8jzn5i&f{0Ziv}P zx2DSIIEh}y7_dbhxGrI4g!7OfOnmI`x|gSdtQAd7-^0Mb71G_^#m_yG7KUMlhy9KT zy9|~iflN(HH}~*i$;K3%mUrl|X4-V-lL>GE+pTH-R-Zx|Q<@_y8YRBC0oH3`lrSlU z34n-Y1Ll)rJ&};x9@S#SP%*|cQAq-lVXTJ57NoaP$IIxgC z`URpw!DySYa1pn7NiXF3Lea({2-EdDc-VI2T`1OwZcvc~sUsp3YMbLre>`lwfC*?~ zk>YMVG@rzL)Y%-hK>~o65m(V38$-a;x2@m@cn0g8<>l6KfvxAJ^25Z65h@RV~ zy~L$C4|@(tY7gF8Ht)chtDT3h zl9%Ufh6K6VOyRmIRcK8S2=9jg^oNKN16yf1jaCtOE5q5sf{cRi6v?#)VT838M)0qXps*xa zC0X9PxOY^;w~F>E!aS`C@`XC?ops##b=+^)aerLL{eB(yq&n_L>$peOamUqi6F;pB z1VMP%Upmuw2EHElq4tubihJ5ae1p!-fVFp9z#ysd46XB--yxqCvNe0K4&Kh^f8|_o zY!Xp{&NC>xNw(54p=;>`$itvneobfqsdL5~KW4lQlM~Nrw2vo&SDA-$5(&Z&lS1mY z3=lIFI;bbLR-eP({q$x$Y$I?gWI@1RZ6xtD7e#9+Z-#aW5JG-!Q;KNGsNZ5Xgy5Wp z!CylN4Hfe@lqfu&Z;b;|{?z;GVGHsn0i-|p&m5iKwb%r)_!WOF-107qfRKQ^96*wB zIylU5_+v;)|4O$8OH!PW+Nzi48|@hSz>gtC}two zRw2_53NK!yTVLis!$>lZYmn(eynA6eroKGvF60xv8^XU#0=bii1yROgz;O>=MjE&x zQ8(5C=PO_uS--MR&EB2XM#@7mert#~Fxkj4ag5ERjU>IihKSJ)QHfThXh-!&(;3Xm z9Wc=xEdfR59BP)a`O{Aj$|0z_%e1562B5A-CL8q7urKBwdXRI-!_=P7fudq9VXZE) z#uiQQz{AF(7&ZKb5m-o`lc=@RI_uE_Yu42e)XIdbqE;Fb81!+`Tdnq~A)rPS78>@R zsKk_K>Vq)#Fb`v#E_=@Ud6 zWDmMeM3ixO*dm0X9!N|X_5tj=5N!_PA^I#gOp_Rhv1%gRtoGJ~k2T_;wd;?Na_gG- z*mCdVVZ%fo$Q)~(5Z&BhG&8&gvR=%xlx@y{W`sgPc{N56S#xUpgcK$mja-Oi@Fpd- zE)sgB-6QLh*eXOcDYAt>K-Cq`G4G=Gg?GRL9HRBa7Ej+N{M_~B-hm=|pj}=emMbP^ zgVSA?gaP#rJnZ8L#%O|3eUOXR?}_0apTeFQL3LviEsGiz%1`Y_G^)Q|7S(4JQGA=K zPR0YiC2FU=94hTfiSE;X8*D3Iv}fMvwv5g-_>qyoyl^{@+C6 z`td)7yB4VMoErGP^}|o82fkQABq(^o38I1GXvc-+@k$X78&fB$XMe^0o(d#yLayq5 zQ-+>P5fk&bka@g)6pzn7lpYA4iH~sLFjGY!x^FCPs;jMC4+{(0SOHchT?l!*Z?rWQ zJ<*Iu66`^dc=RC64~;rL*AM)ZghxOeZha)w%#-4k5>tmpHhVm`M(>H|4l6H))=9ij zm2b!lC?Y;e3dlF*#B0D?NeQuq)3-)DDztLKh(>IrRSNhVjrh^W>PS@cYmI)}w?{jK z)Nm`YbSI2p18DHV2u8VUx)ygW!W>0*ROn>H5cZ>o`G`N!iHAIl36Ze}xAZuYK*JEd z+!33nd-)v@N>J=|sxA^#$J>)QHd(yR1M1cUV&@38i;)S!G~N2E4XxmD>KH|#{jCut z&@5kQ47lRq*N44Ih;gOYO2}t<$KBY7mhI7|K*>3tJyc4a!6=#R z%+wjIahOF3hiKW9_48%ub}(IHz6nZcS~HVk^tX*m^sPRa;8SWHSCkM@8b7XJkP;eV zRR)A8R`dY_{4bd`KDx9(RItV;tE?))rzjyB*=!wM4iU2Vti_{W!x|f$m#AUsxDB2c zGNC$;^K=bfFxeVX{VulQMKLK1RA4J0n|w?!XGun#wc<53`+E^g2G1f_LHn(EkM z_sqCsf(eV`Dw}-~tHLJe79a9WuS!sm7G%Y^wJ8L2a`z91XyNo2?bXw8`6w(r%qpBk z>l^tpn&In5TY1NB4f>8fq5Kb+QQ z8~_+Rg;Ey!YA9!qzY;tJFT4OvU%lHC=L>=p-JVF;?Qd8XaSRqH7#*6Rep(#Cb@~x> z!3}CLBh_MdZYzrE4@9GsB2mt%$li%3bOrX2zR(TNqY-N-9=2J?Yc^aa zRKO9K2JAwo#KV@6KkBB3HS0-348qVm(TjwM2{h%z=t1&ScqWr0l7>luBdhSK$_OJ;4igJtQ$cM5_7SpO;YJR;v`Aww!l0Ertq5M*7=XVLh3|^SU8@%`h zNN*G;jbxo*9@QH&th7k_+>vz^B3Dm)bvDpKIIVT=!FU2$zo<3zy=0bSJC??I-2#&L zMwW*YGg6xo9UhI^dO1Aci~$A)oP(MUSaTh^xkX6myaI95yo2bTjmB>@S$(sIA-OJl zGlIZ}a8Ru|&B%7HBke)wFmR-EHj+4(;bXN+`q_htPR>7LCkKnm&dy^9Lv%gD?Zxx@9$g;n-wRwvSL`80SBj@9|<(m@J{EJ^^^e9 zT&v=fpakcGh9+LhwJXu61dS>h(5!@{v z-kq-N9ae&tl+iHSQT{7RfaxNH@XuM$!Y2O}bOM>?ea5|~%`;dl)~ zrOa|BYQyNB6?phrOp>spuVChK4vi#T>qMW7(iYNI=nWhBw9l*7JDy=v&Y+#>d+oLR5gAe%bU=N< zTj+omNO*2o+oCzgDJ@FW)cKusG<2?prQ(cNdgn**alVg_>gjIRb!72!HcWg{?p%we z2kyQj>zXFLiC|x=f|nHwdDyd{A9dSFkRf3#5nYH7oVx|)<;6%V$~r>;Necn7XATjy z6SuK70q*#oTaD)kUcW{NV)-7 z?nbDyjlde*WDh<}?qFGp?x1osZXRnpeniD9qFW`}zaRp5aXAcfk_qQmFt%u4!dD|G zj>XVA0AbFn_y|5g7oE4(h7I!xy|p8HUFYdDt>c1oV8H-jA;YJ5PVYnuSoyKFf#^IZ z^fra34^QZtulvRnYPAmyhlB)HKkRX4V%1TMd4M54wlpnV85EQdn>Rf`iSzf#BS8}; zWBHL4N3noGCrO+Vn)SSay+pPE@TDKj27*n)3nY!^9dd2}X`^?8E`iu8XlQ*kY98#xHCvhN=T7a@`N9T1wfH^mz>MKFtsy6(S?voB zA`o*^F{{}{A%N4zJv3-<~9VAEP9&gz9K+p7f~Q)BZ=1BY|4fZ z5uT>C?@+E{u9}@gcrHf;SrwTA14=T6nM6$LjWDsQrCIQ9NFXp8(d-ZKXfkVuMx?hu z5wpQcnQACgcVaAAY$yS-a5a!yXsKOweD{lQnfQJwzF&*)8u6ubzr14u@$D(Toy7OD2t6*ozlpCO z{5^SW-|ktD@-lCKx7{neV;7_~jzHh9$CI`5Y)0y?$Cjs|ci8Ubt#>{FpZOvXQY&|S z8M)w!J2IxSr>%-c0ehlNldvKIdtnzy7HCOTMqsUBOLqDqIzfs;8v-PeB6{nb7|`9J zdn-@LgFmX^KY#xhDBwaL?)BF}b@x-vk*YaWHJ??@S5)(D)%-*?*Qn+u)$Bw|O#FqY z=5HG5KCGIXRP!^{d`mTFs^*ibnW&mQRPzqiY@nJ>(JL^vS2f*53gEJQp{m(UH7}|7 zol#Au`X6_@RRFK4{xelGRW;r4o2vP(QT?k_v%Bg)L3KZ>nh&V{`&IWQ)m*NcAF8Gs z{>ydTZ`W~Gedm)&-LTut+$G&h>X>eL|7=s&I5;RUppkz=KdrA%17MCvOty@-5ooxd@4{>G(Ge|CJ2UcK(=J#)t6lV?2MBPumz z@~nHJqk8>OPBQ%Lo{M8zj%%8fD#EfD<3{7k=#GY8$$jJ(TIgqDn8Y=VlpskDnKF zHg&V+saEsZswItGd$zv9-w%JCWjx)BB?oO}e?4%Ge~^&rnl%0xZ+qRB{VC`(<~OBb zEkthSXx04%P18?)=X*Y1=qfmp%wnGX&gCk-$lrZ(w#zvujQ3i5o)<3tk^OEQ%a%;) z&wB59*cG&UJxlsF&1E`B2Q~U?4#vI3*|jmu@Z~Z7Y~EvRd};%pc>OP~^OLslY`-tr zFGo|^(O*ZnqA#>${kkfyZKePgZ9B`}SU!^9+bNo#%N)-;&l<$f3|YiJUHG(Xac3*b zpYS=~`Qdn;9s8PQ<2eJr+_6BD{KI|hn}mM6Ag(X#k+4*AY-s{d==%{*@7InEeZ$C~ zH8o}*&e+fW=5=Q;p8Smm%zK^nY?;s2{+7Vzyxv*!-EYnK3(KG9Ps}m1S^M5(BgePp ze|c&Vdu`MJUU}j>&49qwY)e(H>sQOS{PeUwyd&?;Enlv2WtM!!o^AP(%ctRfey)d& zkJz@E?|JnqZxQt*->~m%SCgct*|5_0HQE_ZFyGJmxc+wERDNi66CV2Qa`vai6I>7P z|BO$6evziU+j5rSU#Z!D<}~|UdxYIHsW117E8z_$P31#RH{%DMaqs~Pe`U?OOy(y> zOw;r*zsj3TYQ%axrQwO1Pc#wlwB;e6tkcAda`N%Jud~iq2eR$UALNa@SMo$#CEK`v zFmGbN!a5};@b5;Xvys0nXNwP(XbN^M6fy6efQds$=cUs-wON4)jI_cY`G6u@2YKj0d8w;16ld1WOlytUQO>&^Vl#poaZcgl8yPVnXZX1e#cgS(T`v4Jc7OR zau-eV^-FBw!v3zx?0!rivzXoW*NyzYvcJ+~joiaFeD${L>hi|iJS~j>v_6){H9V)W z_*vP=#gkq4{dE+Z(({NbcvW-0soNx8xnLk)`r1qUgO#{o(D@X5qhEVA4`-0p4YRQM zGrF_K7l!cgUs|$z4jpIH2A_82y&J^WL?!da!7W*4!4;P!FP6>iIMnshq&{qa)u)=J zKgY4%9}Qt0doE<-Y%STZi}&$;j#5p0_u(wm)LC=y&Ij4ntUtMyr-bt_+V^n%t zq&kh2{`fA-&iqnyf43HF>z%Qhjm@sJdrs`uq;E)PtG|N4W%>~o_2`@IV&@q4Qt)=y zZ!4c;-G0=&hMx{)SC(wioSA)^zuxahHfPj+exIUsnM1$ljkkZPi6}V4?vCE6>2zrs z+u6#`_5Q;KcBto{_)9Mw;3N99<9`co$PQmja$S$;!|vO^glCVBVP*Pet~ZURS<5#* z)J%W&C3gAxRW|<7O?->}xGTEL8un^XBiED_yZPob`I>X4KeMRCck_1#+{X_u>);yn z^;hh0+(1pz^W)gw)kpZ4E~j`U`!l;}`-VR{bh)PKzJu&W+e7v)% zW=zWgOk0%1+kY~TFF0mp4N6<_ZWlk%{BX7jZ@cGdm;KitS!UuzSBk4K`{}XoG)Ehq zV}DB6%O~%c$or?i%jR36Si~3L9PF`xuo4;jYQ)D60dGFFMG>S8uy}zov zD<3?aRDD9z`l;{Pk3W6xT2RrAE&Qd0>+sW0vHu#en=P309p7hq)Rq298GmR?I(zTO zAJ|9Z4Q%uDj%?zJk6nRl7#nK+mOuV&2)FnJu);Ur;QozfXiWP*=Z997vc!y!S@j8D z*I&PRkw4OUyX*7VDjwMRvSxB*G@t)Pf$Qz7v)R1SCe6$~Kk9?4CL#V?qltqe~x9Je}k1=ck?OV^Wh@Ukxl{A_=19)&>FqLI z4Q5TRz0H4^vYTr^``FcO&PG-d@h0zBZKs`W{?s#^RX^g(dUfl<8nmrqzOnsT(hvii z_Sdi3cLVcy;rmPZ{r)SMtvwVk_4i@#+S>CKt_hl7e)Q!Jw{>a$)OjSIx4qIe+1`Y2 zIR7f!U6R4fcQtm!C--AR`-Jo5eg^Jyr6r5lH-+6X=UyHbag3kt8^iBEc>BOV*-2Zjy-IX?p;^+;ZC03;ZK@VR|oM{uRN(4v!Q@5-;&B^w(i18 z9~i*e3~k5SeDb8`)0IouGZE>mUvexT8f4MDTKOIS;d)c{(GU0Y+}v;ZunALGvR?u_ z{nKu~?z0`5KJV}2!RPj~6?0x=V<(Xql*YvjR*wFV`hVw8x-g+A=Z?%x8ch&Oq zjqm2|L;YCpwQjCf?Jn|f_P^wcoV9?h2aHkvKQl`bb8UO|7~A^UHumPgwXEr^&aOwb zLs;4VDzuBQ*|k?sX+D~_m+iii=1Q8gfi?5L$JMX#e9WKru>H{wu_@`lxSl$?jSs%A z)BJhh54?HsXpQ}oWWIV$HoF>qA3J?|uj}*v@3T9rdTQR^XyE%IM`-k4SMz2QT55)e zKh7;-Ke4xz=lKu&Dm2b*oXzU}Ci}VJpINUv-qct%$Jj%!M7f6bd5^zg{gichs*-If zzni5s^W|$NHR9jQ8O98&PHH+lWo1V`e1%=?@;=iqNOmpjHlGz&T3rX;*0L^f2F=_9 zpRljgF>Hl10Iw(sy4pYFs? zem|JK-gPobkF34W2i zlRQY1^rxNtuiyXR`mkvdU-M*h)-Js#8`^!6Ca6I}W=Y(tDZR9U1x494WqXoX+VKzA z^H03YOlMAOjva5rcO8F0GirY6==f z=@+4yd~_<$Pxz7z8vixBaCa2@tVLJ;(8}L6_fB{4$oodK1Cv+rz?g=ttUQ60K2hvC z-{K|KEpM!AoBtQ=)m6<{>cD+`XY4AC?|_!9@$36sUG6L4eFn^Ad0`*1aZ6{gfY4{z z;=Mn)mNY!Xr(aCaq{qI%R^^X$?bEGdLw4?R?VA(J%CFs_NxttLeunG#=264>*ag|_ zvnA8m>2aU(chZvB{H4SAV{NwZ4tMMLxS6kT?U_7wrFu4hb3 z+Tv5!qFE2}){92D8qRLQ-ZZt>+vy9Ln8Y+?o3T2Z~N{CWa@A>Y(aPNKZ zd(QLxo^xXHkyqhC=}U_JRmVv#4g+(0m{;aXO#jBo_I?)zX|3eDSFNTWl7_tHtuJ*9 zzD?pSsnk^an2l1Mi0kj4aZ#6nq~5g>2fQ7~pz9NI)4kxiayA>E)&uh-89t$P5=NYM zWr;WLQ*yom{au@jlOE5oYMdo0hxf6X^R`&}_$s+|euQ^Mu%JqL;_Im|xOX`iMgl>a zmAr~pHy*>f!Toe!cNzBd79)4cDXNn0#QYpJHk@lA78p#(0^n!y15gH%r$4CorB5H z{}QkGmq^Pz8t~I%4JOLY=FFjnGE7YHSKa{91#`$?-G2CgIYBebCn0;)7t$B{j8D6U z@O7U8kuY~5yI|!)BPTSn_%~5o9jsQU~;t+pH!)f!r_Ow zyUsIe(9YuBCePqLaxD)X`35Vv3j1`Zo=T&2S>Z-&On;KaFD#jc(_Ok$dCr#>C@Ayi zZf~(KJ)WZL2BPLaR~}~{O`B?dv+rpqa4txSl1^<#^vU(~(PblPOz@>8mZ#}r{|w|t zj=*R2Fs?Y_Gj+9y(#f<5w05->t11&0Vh1tIKD!(P`s_)uTOZYhGLX4E9LqLsq-T9n zbbd@I)K&$<+~5L}{-cY@kEM`R_JZ8oV%V>gRfySE&HwW^!Bz2LJbv#ate()!4!GST zz3UFF?5sFl{glY)m?^X*7IG5}G5R<3I>Y(5B<8(^%@L-J>^>3A|I00$AVzFL~f z#4GsDK`!{5???3s4)kr~R?>jR3ZPiz9aN;l^d=*NLLdLZ-Tnad zj@t{5JO>)^Hk6V^30RD!BOMkU%GBHyDer*|rZq)FWurcSr``_bqd)oV)S*b3-bPn+ zZ{p~R_hhfo~^aMLuzYegox%`oNl}d1CcW%(UAr5VokdD z_&&QiC6yi-)UsbUsv(oC#w$hJ@bbUqbZ>_Wyb|s)T~&^eOS~8#dqb$}y!bekB{X5Z z4_ACT3H`oKT<+yL>`6*Q@jqGGqo}~mn~m{ioMSYix*(Eu#xBKH-PED96pWP+vHm7)j8Nd*?a2<1ucHFOGbe z35%x(xu0}6MSc84zXq+N-V4sWafcz*ZS3VY+)ZfB^B_zbGn7u9&?mFCJ5U><$~FG` zh!zhi%n`kV*Go0naXt~@SITgF>3Y185kRZf(|GjHk?;PMfTfCxOeyX=X|HYO9z74} z*^UhI3EWCSCJR_d!6171`wBl769n<(kML0%ODy3mos*X*72{Z*c%uf^D=Vo+i#_S3a#k%+f-> zec>M5U6{lBnor=RzX7+YZNpk#!8fjmz|xDqdHabXy1e%i4^10`adM-{<47Cs_ZM*A zmeV-7F_q#xm*ZT~1^%`3Hv+O;gno1s9bKi*SNH_OtL`^j;pIZIo8I%>HKVB|;R!!1 zqer@57Vz?MQ3%&IV3W^i|n|^lk3r@X32DOUQ>kX+n9v*G1C$$h>%pCIT2YBmNGSTTjHbeECzu!%_Bx}GilWr^s3 zWzd`7Lm{s$Y5d@+WUX$*E|m+~R@OX{sS=0kvR*D3x{8L&tb)>p3MdU!U=vQCqtF~F zNXGi&=jJT#R38aKt7qktuHw2^2o0|? z!xrh~Tz||)dN3%EZL;EIWAli7H~W!&)gf{^ItP14O~I4sCA7S52K(@D2h#VxrqCBp zq0}f&iZRX*9b$;Ms%qRG2REhMoH!P3OTCWD(14o#4C1`~dVMS% zH9yob{)eDT)vcrJLoIn&=sR5DFWEe=)40~4je!p1s7^_lN`iM$`%^aLZVcyw=Z0v70$|PCjwd)E0#3A(Wu?me|QOQIqKudQ9vwBZC`no!k`Vu~( zF-?qF39G5>oNlts$%Du*FoXPmo`IFAC*6OUP4(-f=v9l|I7;K>c!NaC9m{o690yk;DtX2B1HETdCrp9?(-!=$@L>`iMV-G8M6G0!dZ*;0nczJBr1?= z=8i%gRZ;t$7F-Cx6_^} z}A zFs!wG_+r_q80!3v#aJDqAz4!V(8NUgeJY%+e{|u#iw_R|{z`jO3R$$rN-~#^Wof#> z)bafWFDl4K^U70Pxz~Z7Xk39`&Mg@Ijo>B^YU#%6zqqi_6Y|T|xzdVsN;KF?3bwCE zK~oNCqpi@`@sA7*1x;rH@vp1xF|^njo4ih7v&~puJo*G|V|QX>$vW~a{zfB2M$puF zM?_g{q3PNCS(u$1#fKZ<;I;s|`eZ4F9i2>{hwS7juGSE=4*p0>lM+8iQ^OP+s)~w3 z_@(Qp9Daf2A231a#B01*N)~&4n`mCEIr*i$q8;}xlkvH~eAiS{T(uIxovKLcI_L_! z3QdZ8=*%u|ZzN;8*;KMfI1d^gcr+o39Otz&3E6m>;Z@99o=-$>b1t{N{1v@b_n7^- zJbDvt0fWvE6kj_G_4om#aafG6UeH7r^BUo6eu8#BD#aB07Alx^o7ui~!NFyhNXmFT znMCYhHEw})?qD(fb?&EWZ&u-ypBD|y@L=24T46-X4&JrwxNx5}@nE+-biSOJcaA<) zyUqg}odV^s3+%ViD!gnVFZRQ5hTs?7TTf5EOr_;b zf&9apL(re_mG+$5fY??uUJ($5h@5VoJLWjaJEY>O({~JV3}y0hRfwN7nq|yc4YOHO z`0oebuq!eMFU+3O_tV0F+5OhEPxm^H-0+ZAr{?iqMHR9)7UxA)Tj<{_NjlK22gm3q zyhQRo49DsqcTWO Q&VerK?t`y`*a-v|4{7qb23L3A(qJ1Go)M%hE$X^wa=e(rT; zBL-Zfp>LE)vSiKU_NEb=vuEG%Y zdB~Ny&1-IhjH1Wj`hy-?So(yvt=55^v?_k~)nHso0$jwO(&+!b!SU*J(%v)|w{x~4 z_d*G?o$g0NobuqE8%3M#yveVz2oml4NpZ|hBqytK^?7UPPj(iWMK;jwz6RDR^xmtq z=JAZhS#W*53fZ0iXwir&JX^MazD&8v=2SPMWZxGWv*a_yX+CFu&4WnewLR8!1X5U3 zHSbK$pg#}l`IIy7sA|M1_WjvLOq93gge zE;gekl_FlN@X^B`(~oKMc;HAOqj6^tkId6S{IP)~e|`albydSn{X8~ZQeuJa!LZ-) zn>`Q{!IBf*csD~Dql>PwlnM9gt)RQkERCVN{3<0M(!kT*b^P@TZ9)H=$*NSIVB_0v zyv;2}&b4d&gV4X6Xgq-atR<+IwdU&*W1y{>hS4v?=ybyqgycm~*@I!66{eD!-vMTx zX^ND)0WeQLfLSK*>BL_iexWu*3gdir*VGj z9ZHf8V)Mf?aaza+R?V;ybUJ&|`MnA$t#jF6qq{V6ZwxA5 z3^NoTqH?yj0q9ykf)ur;+GUUT8>e=suL0g9P7x+-{={7 zp7%CgqUxk{{^xWY4ZEIAv5Gh8($xvP$6-6wNjovgiche=e1|^`0X?zVLneU_DP8YB zZkMeG)vC$(n|cMg8(LY%%m$Qw8OlxwzIXg#BU=8{9CLhMpzESBVzpNA=msUye!q-d zp9Ycq?IXN+?odj7TQ6vy%ZWAxvHp{7u-fX!MheiZ@A0cRWM&KHpwqaRe3?vVZO6(> zb1-A16IGtDqM8C3p025iI%9u2HbMu*kCW)}p;EG2|Be-w-=iVJj`F&fIyBYsIsapK z7|o3XncKo4RGYV%JNZq(gTfbdIv@;R=HH@4YPz_%FNtclFmeiLLd^L4D7MVzKTg=g z?2;NQunLEx_*Oc5IF+2s3NfhY9=^qj@$AmUXm^w3*6ucx_~Hql^Q8ih{8Y&%$rTTC zPGfYATjq1+kHm?5&{z8J9e! z|9b4HBgl=OANfKjhiQ|1jXPb))ZtyjCP5EYOkP%joS7L}?*2siSG3vV*e(dTH<`pXv1bkQwvvbwLV$%m#loBFD5(?9arz@a{9?o3oC= z;Lc*C9lH-(%@f>V(nr*`Eo5VC)&S$8;XiyVL^bBqD3d^>P1DBaI9F=;_=Se761Ws+ z627Zm^bc9dDr>S)CTBnjo@sbs^%e&^X4A~vB(8iv0){)r!8bY&M@p<|xZ!Mi8MO&3 z7YaSg!AD$8Ap{X0o?@qrBy{@UQ=9Ks+MRZWjg;7dpvjKBR>- zbR?pXpL?4@|7m%%S^W~UbN@s(ck6drq#s6_s|S(n_$w$KzZIvxtwF3sF3#vo;xUJQ zQ%+hm!X-zdbiXct=|6*v_o>qH@hhoz!h61FuNh5lpUeaBj?Q{Hva;1JXj_)RpRyA2 z9VK`Sm8MuGXaMzZ&mvRPhqc)ipfaU~oLZzQEy9eieA!DXdVVBwqLrj-5Ad)1%W=ca zg8!)<0A-&me6M*Wb!*(_<;#_6kHSR!xMF~7g_eR3F`ROiUBHcbzu_8_K}KW5p``Sf z1z){R_df5(x|XrDQu8b(7)(R&iMdog<1X!Jc)>=Wk)RcKzteS>pAZ!$VBWa%i`LKW zpv`Y@QMvtT%uo==s*G2L(eq*t6e=`55q)nN4&!!&xjxT?Qv#bq6;V6t} z>kWE<8^u*@O~eX1)vHR8Q*7b6MtJsH7Li;_IxY6hqf1+J*=n~kl)CrwfKmktUpSlX zSW!U|!;I_j^2ji|}P5w|V>lIG#5Jho;N&14fuAvT_3ZIbw+bNci+UJ~~G zddSyR1Iv^o+QVqpB{|x-KM{^;iI}-pnW`mTQ*2uxpT%5+_wW=Mo37HSZAYoB!<5d+ zd2pG)Sp0cEoBQe8)6S-id`HrJyjN1i!P{GC>gNe8xm*T|Z@Kd+e$v$VXfe$6FX4{T z9yacgFh{O1kovw%N2pd1o-QaM?xRmrQo3kT&2u=~I+JfpADY|hY5Ip!o{?Tk_mty! zgVjNtv`VDLx@5!+S7mR%zM{VaCvyGhaD0BK!Hs^K(c<^(SXx>pMXTxIh)M~TB$X20 z7NQ|%Hd`ID38J^o(rAM`nxvh;q-RB7;=_js%Js(QuP^Bf9B7{IRp=OhrX&Bt_}{kU zRNy$18LeAMh2ylj-M?;O07Ef-(|Z8Zf+E(K>?PDIMOe`43%2zh93Cp6XL%}fXpTT( z`cWnqeUH*rwvcI668*lo9!1;{gEeO1jI}N;IX@2ic4qi|%APr9E~0ndRjj*o2jomE z+1;~tbZDpGJ@wa8%B#W93A>Kf$+M}`aU*>*xWumo_966h3;ZT4QfjO#4yaeayLkX# zI;{uxO+P5ru8=lg(r0RNBhkO+18;wzN0<7Bqcvk7)z0jIOVbfD-xkQZ>kh2$?B$2I z9mD8%=P7;8U$kuRWh;*TqM~*4*idm%x?~xT%8C^7e=Iz-i3 z7dL!D1!>Qag{RGV3R}LM1=an=CHJ@F=yj1=rdF_k+I-=C55TaqugGv_E}S>`khzF2 zE~e#>N01o(_c)WpcNZXZurjK*#FZ9w;Fco$oSlMVv%_rp<$bhkPzYDGnhF!${rs2gb@HgJWxM)6 zpdfWE*P1Vhra|qjr91^M9IBXVTPI}aUtuyCc8J`c%gp}^#QVt|Y+ct#ly}Q8g_VhT zecz0$z6&Hl$s&K3I7El|ljD6kD(Dfum0(x+f4$BIeh;9$IeC2d?G4m8Q1E$#o;Wz* z7W=Ya7Ay41`Akc995Gj-j7Lvtj*k)!Zyri*sujHBr~?MCG-2)U-0@?$3U|FAfrAsb z(%Nq_biQRI_qNp}|1dY6cv%fntM*WXsszY=9EE3x(~XT;%>V8f%(UIfE=?T?gNXfX z>zgn1I69Wc3AzjW5X+a1N~0ukZMrgZ5v|UZpr?aR(zuXGG-kI5_4+i?QN?5UI9Hm> z$xp$>`}b%?(HK1Sdx|>sUr4%X&h8xd{F=MVi>jSL23)s)_ z1Gp*hPx+IdQ;VSjo2fkp|Ms-vqL~Esb_er{q%P{(wU0+9v?D^eufp1jXu{}zHejV6 zr43uc&fhD*9ye$5`SS~-$`WX?yD$B+eSpaNi#VG<6_MJrDa@>kd5LTziDJh(MYR2YSTcHbybRpLZ{`TQ8_;(YgzK;<+ZXO!+=JD41Ei~iqGhF!NL%PTJ z@nb9+Nva9_Iln-E1|LTb_ogkI79&GyA#vY9h%KK1|G&X}x~3sT`ftMPgbp%SzD>T0 z*TDBXv3YANk=a_yzM4NGsU8(pbp9pHa8aVeLI1!}hgpBrFfZu~+qk?07hd-8^FsnK zm;-;ay=7f7>=*moo{vWQu0xlqt?6Fya48a<)g>7RxKn?fC*(wIWv*#mr2s8A2M1wbj>mrb4T`ISkNE7>`NBSl)Q$t z!Il)Atih#k-J^oMEzIM{NeWjxNHs$LQQRqvYE!VM`5oq5|Drj{Yt}KhQ7dRm>_d9_ z#SjXr(}g<211Hz3^2A>%u!#MOy-5N1*X)m_@oQnYdJGl66~h<1FfyNJO8lx8uko|N z>5$u8S}GeewPfjml>u~f>Zu`lI!#+_!9Jbq!aBSE_|l8pG08d-AOC35mv@8c+{-$O zy;aKxeUe7z(bqyB>rbBg;oPeEufR%4aTU{23TxQJHv7xs`?ERNec%ht*?EL3dh}C( zayJ+4OQgVk$LZ|#n@~%6PR4a-sLwr;g7R6ju5g6T4in(!hwd+iZtY|8Zt1DKOi0ayU@& zl8(A&k=|%|yjt3aV3X7EUmU>pwCzOhW`VEm^G1olHW&M>Bj>cQxH;e?rJcXe=Kl+?ZRGic&a8i%m_L&U>CD8?P!(cT!)lfEN;EJ318A)*GN?bCz2|h4TB1_@2-W^wseM-*jv?>CTkr z#_z zsS0FNZ_=q{KDfL3D8C@>gLf?vm=bvfoA)k4`V&!#H`&VO8Rei)@h~}vyeG}z*=)(& zOg#A@!X-AJz=`zXw5sPm9UkRL?-srzvkmnyHU3GbOZSt0-CT(EZlHq73^X;0v-QGy zhsCr0!|n@m@E#h+e|BBKBK0#cEb+&Plg{+cwVkg1{7nP=Pf+XWg-p1Tg=ZH;s_}Q} zoc?CEKFY@T` zkuG-s%}mTHu)=xUdwBI>BTo*~MPJJ^zQ=tvt=nVCeQpoM9(OI&6t&Q$J4i>e9Rwih$$Ys zNU=E`E_WugPtpG5no|U!d8A_s4=Dac7>eD-vw2wpuh#vF`{}h}n!;q3<+Kq~)Z_T0 zp7~g~I+#Z$ye8W{7b%|?Q_ARH=nyMHXLvWvwP#S*q+KMoBZ68sSJO4`jVLjF#k#6f z>B_G2Of$oPH1;JjqdI%MlXrm2!UY&QX&k;qKgW&I%Q(4mF3xV9f`aY=C{sDXb|l|N zYxrJf`KSe_Ha_BAAAHDq)?l9aOcnnmx3hDrk6=;o47OyCG-bs(@&CSBV`I5Bx$A7B zO@TjIy;};6DDY=*bUN|r%MO~_F`D8IoME?I6%aiuo_B8F3;RV+n9RWC0+*$ZSYJDu zc4!Vyv=HjzGAXQzT8NWQD|p!62x@Ij#R+<=gh(=5DdF+~{N#IgOC zC~)3grgL-zMK080^VAA(^W7w}Kb1f!_Rq=TS{_VRb<-PX6YA$@czTgJ8JehJ$X-2? z;ly7qm7)!G`)EerT736VL+3?5)PCQKkZ^01UpvCPRZpUAdLLK1Hvw6$tyDSXI+grs zW+xXPrwvO*xw*;#j5?*p^JpA?N#?U<^Y>unYYS4DF4Rj=OW4v)Yp76jCGTA3iSZ3} zs6S~&vJFKfTH}iXg|BQ^&{pWoG8A~x@o1AD%8R=%AU0+R)aNwNL6r?8n)VTOB6&17 z`ZJN)UM`{3it(p5v65LoFkyxQS(kXx($Kp!sJ|3BIup67Ocf;^dQGm9ZiqS*LcW>~ zG+a0fjz$T%Tz!%Ti};XQf-LD=olD-wE^~8{2M~#04x{?_2s3@cMkMN@$w-}E-_)ad zIXdj(E@g6!Xhhd9!9UB-pwlbs>D8u@Y~~v!ih5j2AKZUXRaG|S-0!5n$}Z^Y2@We_xF-{REJ8oqLV0#-F{ zWiAhM!Si;qn|;Y-e&rrF8?cXVnHkV(n+>#PsWP}ltyK2zuLD8-pb2zFws z*Z0$rTVG*NEI}eN1#ITma%_>WV5&PDs8Cv#C$>Mu`57Lp{b?vn<+EtnmK#D%KAs=< zSWcahay0KnES`-!OsXSZL%LxS`|rRxVVluiyu2EO`haz~)q0B_w!9~s>32wd>?x9Y zU_z=Yar~n4FWlHyhmA#pFk!`R{%V{z-Tu3nzh&Dg*pX9p%tX}xEoa(8rwaVk4|u;* zfqirdoU}{fuCu!uNsTs}jK-RNYid*~q{o%7>Fvk_*!WtoS*=>& z;xEZ2cL}-X{oxz;&co+B57@mGPE>L;j^;YtCU>Ja1jlGlg!n)TZ!)FelU96D+e|W7 znos*;+i`I@hghIczu0ZyJy%X*S%w}@cQ2q3i>D#qScyU{(&-`!D3l+dM$_x$S@{c+ zqZ)8b&y7Ep5hbS-~^X#x5YA!Qk$%1e4 zA}JC-biUxs*MV$Vl@1;sSj!Ie6q9apBn)MvXydA>T=J6xov|OwJ;(dft&!Rk_F^I4 zB)ve%k&jSJmY}dj=CnX7ih^{`lk&b$>Np=srCTQR$HU&j#@dWu92t(r>>31poh{VK zWBJPQlWF);Gd^)a0n!)$W_O2vNBqtUwBFE%;&cEK0 zYHfhfj|^pUb3|dND|mbYN9}oN4y_3sPH%T4^AM?(sBHMho%h|Q^9xmYb-FY~kq(Op z>Bc|*ZO~lX0+pwAG&xO;qTaeuiCi5?{?23r#CFoDD76rt8D&AGTuWzfTk_=Yal6 z>zFD=!`(EJjoUhfs>*eRypI=j%#vuR*IkUdFTwwv>=pb;6>iW0`n^M+Y#L4@OO)7< z*b=-xUck0hJcmz(1!_aG@wl6;UQYrmpRcDCE#_;CQ5 zzSJSY%$3$S#nQ6v18D5|skEy?sQX)Y^Xt9wF#C0gCp1i?ngLqu=9|rMZyrSx++5)* z9>Q+VZKOSg**tE*L9AO}2IYu!l74oCZ@PRJrXwG+VIldj=)6ecUsqyluq!3|S3u|Z zGhA!*#$+EiZc(U?y`SFFLeUE}E3uY5zMVnAJ2gJ%=WfLQ-i(X-C3O36I`lVWqi4+& zghmx3|JgP6Q?nBz%zF9hE>(JFEKe~C?l@L>nWY-+rj(><`~$m52h~U6MDr6khArTB zy;m_hYXgM|(^Voj#sHd0G%0*5mYa{njv`&b_ntV>p790ruMOK-+>7kdvIG5gq zg@!k~aqbNrEqq0Zw!zRj7s~Z@6me7|oqFHxq||Ri1>fHdqbH}}zs@K+``{&>9W$mj zzmFvAnL;o2slnY=oA`ARR(s(NRh-b`b+=DavGF{bIQ0)LtI%L?OKf3y!yM-oHPNvD z6PKI#gFZfg$~#82qOvlUCta>Z)tngiy!blpbBMd%Yyyr)*kD|sQHh8Fd7tW%7?DP0jRKDC7vt5r;rnNdkP3^E!t(C+sxlp>k4C1!E z#(W_!&>?Gu1ChnBzT|~z_SO9G!DKSHO}twxlWM0W^93=gWF$g#p!Naf$~5zl#wN6K zVgVmFDwKMTaI!D5A<;JytY+>d*q@xitW=*+sCquXzfhd)XMJXcgC*#WpDwR$zDe$j zKe47SnKbP|8UK;fhlj&AG9MF$dcPEi))kPR*BT^zFr&!C0;YFf7^|{t4ofzTz=vaN zDOyn-S4K@>9$l(vFSO?;$MiF2eN?5284Any5I6zqeeEt>>%wWcec6Dmn=J zXBN`8eOAy~JR66zMlj{?hj5YA(B-&X^p7~sbY^>!Zp|NBtCj^#(_{2$;}bgJ?Zw7Q z=8*D2;dzHlLu#KmmkXMN&gJRk?6?pe57XJUpYili^%n&jWl@U63<`d~2WRTt5Ly^X zWyR;&$UButnX-*Y?hah*ud%{>$t@JMCkNqw5}*+vCGbqE5Rz}tFI*W!9cSO*ze^{{_+maEvOEEQuf|d5`gtV1 zWIid>nd95NVf5zJTa2F3%VpPmLcqRBEYn$-4drr(`40X|=e@77y~~2IY5GU%_}EOZ zD!h4&yDeoO`2yvApP)B%0r{RdhU5l4o_0AGt@R&ycl8QnNw~62F$-|eeGFoDZz0uA z8y*$#9{VYQ&v;gWa|#<+U!o@>t)fUuqng6Tox|+VI8yYwhiB{B$i@3D-3Vx<3fBU( zb;;qM#t=HZOGOww6hWCM(n)H72n+Qwp}(W9GJT!#IA=c!w;$@zg1g$}xN;s9NP1JK zz&X~By-26V-KGAh*JxKRp$!+h*-rgZ>|URWo#&G2;)!qU(UTK6u+fuU92kViFim=P z=qEZ4uI8gRjUo@vFQlmP2ug3SP^51hG6pHJr8^W!e#<(_Xm-I#JxlKVQQ(%kR`Brs z8F8hMxR;z!Xq?E${2E1`l4;V143c{B7ylf4Q0S=zhsTzr;oJd*BR%wD!BjjEyr#7R z3wuMhmCso65Aw?WBoIxA78Z3VmwrRf)NTCR<`+~Zd6}2lcu}SGNParG6NxW;=xkmR zb%f`!_j_idb5R^0AkvL-FVlJYt8qdGx|~lIpGmlSgh$I9q?nC`xEwBy2>(_m>q|cSywBOOe+w=MME#DAYwvH`Wt%|J$ zVK6I=#){W>>4)hoj1l%WA3anH^@JJh6I(*V^Zg-GI*kIfi;!Tu9&_srkgX$lH1Y1t zci1&rlsXGfSDb^_+(&HM?Df$4q9H)NiqvZ^WZ0UIL1%pf!SXF#N^8f}v8!?0`58an zXa`F0$JL=uerzW4ZPyA~%vU;}stvc_p|oXwBM!dRD5YQws!wXe9``dDJmB9YVtug z>6y?6e^20M4rj3EoHD)+yF(gIu`u98lqwN}MPEZ`*3xX==2?jz;{?7&bts}<>A|DI z9SXHBEZC_X2d&c)E^J=imhXh@&}*1&8HeAQV<@-!16N!;96e`((9-mVl8fZ%@U2GL z8tA-$&X4NkMWg;upX5)nIoye?ftl3%O`WE9 zo}_rEcrwhLO4X%7?&$NP~bDRUJ>eycQYx3+42L2 z4CtNLKDK*=3WVX@Y=yc7*&h@1%bRU5^*G1uuH8kNK|3o9N~Y^Vrl{?<26g?DpqK-k z6gp3FjXCl7zH=%+em@HPOBR!dc{EK<=5R_~K)E&(XxXVh@LYI|MO{p#jA6g%@8&Dm zlrO=P3yo;{j5*A%I04cRrr~(TIlL(!h-)9;3M*{(l9h4}tJT}rda+mA-qD4kN*ceVk0gHjGXs+(>Q-)r zwskTcTDb_lj5gBNt~yD zbr0EyRjJr=eJfvRGn|CD&x~?R1TPIgM3A)4;7Z?fpYGpAGe)uR8-HNiim}YRc{Q!q)1@a(p9DW;8>I-d1Dp<3^A8H* zbo{;_%*%3MJ9j&TNhwq(`JSgN-$zZ&8%UwH9M_w|_~eI@h|UyeVy5O)lWL6X?^@{j z2@UvI)KXyXCw}_CF*+SQQyd4Bptq(#KOg}LD*mJ)?I}0)#X?$k&4#UXVv6Me`H_a06(BqBC__22)mM?D`toAL#`-@T(SXu_92iH-gq(*jj59s0YN@`np7%eqDEMH_Grn}AK1Ec&& ze$h=Hcfyv+K1;wfRSX{rbZMB#QXD$qOuu&z#V1cmik_Gc*(^C$zq*gy$IRgY3#L=b z@D}EJZ5sVtv>LBHop5rGKPr1=>D!sJ(7n1#(7GR@`fv(Oo9@O7S8T*&k1D=qLNwhM zGN3D;|HU4|t87%^47^+Pn2qn)jtiB;puN4E#0~F}ck59)`0_k+y)CQ-I&~Wjp>}ZH zw1-LpXTkb^_TD_M=B^7AU;CWqd9G7wpaG3?%p{aql8l8$id0gOd6pqkhRkHj6f$K> z<`5EPe29|Fq0IKW>w8X!=ehU!{qB43=l$oNKC5%qp7&a7@4fcglj!(Tf_Kr+z_EcUmc{mA3SBhNF5)C8$Gc&l-a63UvjeWRiNaoQ z#rW9iD_bPF3gahUXXgAhDo&e%{ts?phW1J5U)2rf9_hm!-)@4N_lhtkV>Mh0OMuL- zE%B_P6uRzuhf|E!Vk+HNlaZKC=RbzQ8J^F5muJ8@hb6pVmp5)LT@T^BnPEgX#ayf=>8p&{a!9kq+B^-hR9^jp2 z7m1z;*n34Mn6T(BE~|M1^Bd=LAKM_D6tfL&<`2Lb_0sU|0B`{Y;hVyxNTsd4AHVehy72OWl;x94J5 zx&to%>JN5HhC%%TJD$C;FG{Ar$DS#+Fw(}9Cy-sillGpC+E|Rvn>=yZj_+_xR~znb z*n&G7d|-i^`mp74Je1Hqc-0g4u~2b1WWNi-uXLvLMz6-~OYhFuzS@UHgnfW^Nv+vy z|6zO0wFF0`U2{)RoQfR|DiK4R%+OuS~p^mLA34}aymx$D!_JKgYd$guh{rj0nA=<5nENHvKOJ}A+=ir9(mpX5A`lW z-w{dhA#yL&*KLdX-DByzy*I9XV}Q#VWkTyjbLhQ)4n9qsi&@u$@%@Bc*tzuz+>CRD zdXXJ5%+TT4^^)xGS{7SUbV{{mUOQv9`aA- zP1bjX1_?D7bF>WG%(H}fj+-EML|d*>yc{yr#^CAju5f>59A@_pfXiQs`H)j5a0b@r zH;=ENyRQt;AdKYg>Q;F2x*M+OF2>9Ow_x@0*|>FjH>m188?$fp!OLAY@l%;wKx^{_ zZh-~Rp{qaJ+I=|YH>R^HW6H3jaUndp9f~GzOhN6LJ5E%~W~Me-IPTsB=CmmnbTS*m z)>h}y+|(4NYlSFKtFrU^pbwRU!3?HPE3ATk1*x=$VY&bHEE4_(@h9e&H z4^yMC{kGOHt7;J_t{aHcyRE~agHoZQc`B$l?S|eo?;U&eBlvmDgifX3@!AOwSY_Ua zInf#R0XK#Db2prB{enq5`ry~B)u^!F7M^b&!iVhn4(GiFVChI_2&q>D?#E-%@wp0Y z-}4cTN6*72hwLG5%TQhub_Y%l41}{oLvZA4b>3_W-A}{9&^b*67bi`^WR1I^xs~=I zeWlx(zD&ZAOH=WX<|TTuavR)9SK;?(IAMMTvKAc%;EJ}ST9#sZ!bq6zv z^d=}h)W8MrTY(0xCw@455{plIVTJZ0U}w(a{GBf7(S9V;*6O@K2%V8gyH9I~n#{`O8*b2##UZ2YF+t}BJ2LJ%mff4m2S&Waj3{HY*&2oZFaN@h z&*LCkznZH(GX<-|N?dgE9o${hj5liA88cr-L*kJs_`t>KB*0oVo}$Gj%pVKiOk8@)}9``?|5mpksp<)`Uf^LM)QYhBE(5%vkHP?Fq&J9lB z%bU|d6j;dfUthpBv~Hj3@Dxtpk)rsa2F!1s&HKH$29?+9LldbRZXGiS)tqjl`)+fH z-tqww#`@zlzqYU~ukXme|_fJMgGt?^)dHKJqkmL!nuxQH#|LR2PY;h#IKq$7!frDzINRK zdBzXXL`?hrhm^z0v*Qxxy!SFs zI@}ynpYMazu>R;caWS*Lo(_3~8}Yu{ld*W0FWlOm0y>)Y!RmS_`ssaU=X77dy2NJmJBlEqI_~1MHvm0UWwVn|3Cv!`J{})T>`M`%5WT0v6ERIxrnDfbjAs~$6!w93%E?YoSx_z0Ug38;?3sz zOeuLF^qun_lbVfy?PdpHUlS9EZoUo9w7Z3tERwZt+!>CDGw}2>vXf1<qHop89+xKoW){s3T?ks@fkSl!J)cr8|)dyUbaR&$38t{d$^FUSg6rI$14E5~P z0Fv6{ldeVFZcYGt-z{X}Hh!p~cnaU`X@@7bJG1?1X*ec#0iV3f62v{e@mn_9aLUYt zq1Q5unw|ichkS4715QPm$?I&I~%R$s=}l~EwQF$ljy22&ky7?vbCvY``dpx^PG zEG^(XfJ!)649kMQDx~b=#}_y+s~I*hEWj>hC9Kky=IO3wbcQ_#&wu?!`UTla!e(OE z%wsTX?qr-F9)z!RGVy)5AI`n~7#F0xg5&d+GoO|VvH$jMc-mWn_jM1TuI4Ga>*OXT zm#%;&)q98rdr&`Q6~hj+zpJPPzN;4F7p-NmZr~kUduYrf*nmO1#QDeaAz zKa=)7y=Q6{Pec2l9#Hfq1M>1MS$xTRFzNDuH*Z*pJr76o6s-YR(mM%npS=mQ%og&Q zir-;Uq&}M8>H$3;wBXMUwFl3gC%H8G0jfpxLZ2NkV6n+Sbb6WyOQ)Bzb|3uUyYoGK z)6*K7EY;%`wqDR_juBt9dMH?~y}^qcTcASuNB(WECf)a7$=_BZ-CLr@zd!g44`OEl zx+u~5#D3;CbOjE&?#rJ@w`1{3U?nZfaqhSk7<2Iy^xe>mE3N1VdKolt4f2PXir(zt z_+}VCtUbPpKLRJGBw@<9XK=Vx5OcYB47Y6=$DBf^fMKu_U$T4{j&DwDs=?u~INE~e zEd2~GZac%LOG~lUFe7;PXcIj9SczSB>f?y&Cg?X}2zn+~Gv888Xw=&QKVRL3x1@$V z&x-WP=(Z5n-42cX{dhfdO+5ef7O!5FPkX&y!Hrp3FwEmB>bif#XEPJo5aV8Or9jI2 zoJfKL_vW+3dPAYWVIe=h=N?1{FUA$^Gw_C67p|Y$3{su?@@(JNs59FSAD<^#3^Ks+ z2@NpT?I~tFS%WuBH6Yf0EMC1i2hQEufN|4@@(Z`_VULHO+4s1ESa~ZP%V&JRBk}#| z?qU^qQ?DI+HDESQPMyaKG9QxNsRmX>7{UFU8*!AE3C_EF5a0Tp#~BlDV6w_e%oX-Z z49W)7ape;NBQU;sCDxx3fd!qmLZx&*-bm8`Npodz)V{@=zI1|I&*^Mr+9NO@;>2Gj zYol(vjc|W#9=u#)!lN^{Luu>wICb-J@O|Ecm9Cou*FB@yovnAE^P{co*r~;+qdXAR zt}KN3yfsX>r5%_}iex))wZLKDZ^G)infM`lC12&)9V*)e@`zb&z`7^xcilS!Rl_B` z$NAy-jKx4C&F5n)I>W-#bbsr*%{*1f2e+RMV*L)!fX?e4ur{xrW1z$oEB6GUdg3QO zu)%4#ciJkBzEzxWMX8a%9iYgIvKx1@QY)yA|rZgx3#|`n^ zZPaOCo?9?FDg)N_ZOD6;Jcrh|ui(zWG;CNF%l4MNh0dQ3vn0O-*mlB4zF0LL_hrrF z-99dcmo$dEOFp8LM@!sTtpxR3wPX>O`ogrdLQoo^hTZ3Pz#yMcEXlG)w>jN0YQ+p5 z?Y9g3F7)7^+QgvB?QEucco@7kQ{g+V+=nwy=0b4KSNPc9l=j{?*f5r|sZ=$O8D%Pcq59~SJ29xQ&+RzQv zP*KXLt0_$SL$regSj|iQzV<{kW2R%T;)E8x?HQ#fA=n1iT-V@gH>Gfg*4u9GsKna_ zWDox`m+k?c${FqdUS`voH9vb12gCt?v2!_?ZF&xu<{p5;VZbM@83Kphd%(OGhoImQ zV#$Ic6pdBEdK%FnUBlqJ;a9ZXV#zgT+<=jK&3NOGRiJgJ9lxy}fcfWQc$(b>u=zHg zkJ{dg>arfM^%xGD_M8PrRt4ja?&X@nJ@M6~w^*5a9P{NS~J(yVK2bCEQ8n3Jy58f*1MT!kSMXaoVTO@aW?J7(Bi+6xRfR z=IqDda!`>4Y>Gf7i`l#~yB$_6GeNy3>!3We9glne6?^pvV14eTVb4vRCl`N!O51cE zQ<1o^Duty9s^s~Sipn7g7E#2Zv1OlDBiv^1o`}9bnlK7+g#p<`9q~J zHg+9uNe^dJLLOtn+G;i`Uk6SNegcU~17VHT5I*_s4Z4qMEpAz5h&iQ3_{Ah0$Mmv< zk2~r9+I)M%@&>6=LyRik!rNZ^4(_+SATS89iPI$* zpJ;?H7PzwWPWADSn;Dx~3}!jDfhZ z(J5@d-~njwe-9X{jlRw1!n{_?SV+|lG^!})O%C{CJ6{Kgs<{IfCbt9U?@~xUcMoo? zKLsrkBluy1>9Bp=4!oSb0OvM5gu65^VTbIcbmxx)OlUThb>HX;WhK*ifA#km+FzN~ zc+SCg4u&k#6P3*Mxq9?Rus^mO=T|O+cy~{1fBQH+@Mgv9wc3CZjkj!j z+mm25GZ|m4pNK=x4droMi~;+Dcw$fh?ugL>!)2e~Q<)fi0!KrSyzWe6@MGLK(vua& zPNj8M&7+1v)4L*e zd-8c)cxf6}ALfZIREO}al}cE!D-gUkL_x7#6K>{H3<;BCp>yX>sJ*Bg&YW-r-y68` z8Lt{b(fWn#+=>o#Ub!QjnKBr3UcY1s$A+WWWHui2s(_Z~0$8!vQ1qGqgk4pxfCteP z%>UUqR2`(uM8OP}cAt$+KODgFeKD-{iAX$s`4u<3eg@Li8nFIrAJctt3wTTA9_T(e z4i2{64)Zf^@;=)v;mY6`w2mo*zANI{zS3@(m2w9w3VNeaFFMcY{TxbLP2s9dlHpz2 z78ZVJA#R(c!6tf6g+~MI+1E%FIDcv}OQd^6cNujCH_tc>+tUy~MLdJ8mzC)WlDlw= zoAS)Z-@$TmAgGUM1c#?z=Aj?EWAT((P?Y8f7oMB3r7j0ywf{QSJYo-uyqECdtA@d} zYg4&&(o3A-*9HE1e*@BYT!RNAFTi2Hp*$eJCC)!ImMscQh1p5v5Tv&pT72yY3x_Mf zr4cK@LjMysr8S;Q=LbQHbC3A;VV|*M2TwfyobH8q7|LSaR6~mKX=rVK2&x@T_#V&w zn4YkT?ai10cVY|p?kV1A{lEfkME)pR{2o+a+ye2=70l#T4Q9G*=5JH4f!Fi{;Q4+G zq%`ZwzdC7waa1O)3G~LO&ck??e+pV(9ftE7DWm?emAnDQpz4w%+-!@_7_bTGAh9Iq!uN$I7tKXd&FWLFd@|9OVnXSb~Me zc{X=-C~UZD%#UT-@YVb9qk5d63pr>?JNkN32N4bK*_1GI15D}4~N3^Rlj$!5NQ?)LJRB!X3%BG@0D zi0#K#;E-+SadGi|+`mR2B^@U~$%Z>9a&pI!y;FJ9c_BC;^eLSMr1wyA7-p$Xru}#u znN4gmy3$$48oG}}G3zhhK6W+EZLxv*Sk8qhU-q+?cb&k%oc0x_b%W0*W-;9pdH8VA zdF*PSjbEC*;@awZV0L2+FCNtrv(i#AaEdD!pBl|?qNp+YSLGvG1Yd*x4eNneISw_*Hh;V}GoauAPt-W#{Hdk+Q^V(`O< zBYcFyM0gfb!S4Bg!wV0LaDUA+yz%xqM1RS{esuOOthF1?+`Wd6b83nS&vf{^!6h(s z{XHfYKgZyn0o@)s6CQS&&)VF`J(Wkxf;oHuvB!4>w<+`BDh%5{V z=*knG9l%o!o^jJBR`}rCd78_0!3(5w&l#Qz(XWGeMZ*dxyW+v~H6FoM$paYU)f5-6 zH-T+A-JxD-9A8)X3{J&Op*xLdqfzUHtiYxzR$4f~i_Qnpqh%`Ju19k}riuA(dr?|k z!!xf3!O1Qypg!F-T$$3E9qE1ojxJipJ-nvk#>;8Acg0CadU}~}Iy4V9PWj58S#<=@ zYaPMD+!lt!1~MM-5gm7W!KHEPcs#+4Vc#U|;%f?>%S2%HB9R?zv$L~B!V^b7;&GKwA@9e#rBpi8*(z<5x(S_UVhzT@a= z27FGxrZ|uK=iBv-aHdWnCNA3nvHHertB)m)shR+l`@eu^)B#?!V;nq;+>FT!RN{IK*wY$LAt>h7o~xLV|#&rStWj=8|(v~ zDDi>kX^iVJ9lp?7Z*uiSHs9+$SglZEGq)MxD^EK2e_}ao+BqMa9#^8f-RJS8kN3mD zQH40i(ic~RIpOq6kD#<`8o1KkhG#sk@>h4)!AJ`C{lqgIp{!!g7}m*muSg{=sfK1iV?r{X?e0#%ODNedis{JaUF?%&9*dc8khP2#STeYc^Hjk&$uOx50YQ zp!I#9`tG1JAPaYg^@B?`efS2i0`z!v3|e0u3jI@D;7R`)Xul+v*(%z@=&z0!5_oAG4e zf!6FrQ8#qBK9DI-9}N@2%lVFXm*HK(T)brd3_B=Ih4m?2Aavm{@LsM7Uq>adL#-zx zvx~&!6W38?^<*|?lRqZX9f5P+L}E{uPq3-{4d_Oz!N6rb@Yahrux-5wx~z!AQP+>d zv!@~4oa{VV4d!E%i6@G@4#KG6zA*fiG6dMX!oM>5vKE(=aPITDX!7L&bQqe+Yd#g> zw#bVdH%7x16%I+7aS*z97CPLTg8OFAz;(Ts(z=K()3|Dg?)9VCtMEPOGb~JCP#v4huJ7rIYY#5Rqff-R zd2KX%dSU^LyOfJ}M|z;=i}pOwbQd0TQD?XG=nS{tAbNLd8Vnsn^OEU>7^K~otC}B& zH>#VV?G>^+Zwkg7Jvx(eXaS6FL$B)PeTD5sRcN~_fG@pKgZn#3;k)KoIFfah#U5Wq z_l52T2fEXLVB{E(Hs}c*B}?%y1!Y|EHWqWQS34*MD+wo3|lTovJD~80LhYL}g@D$zCIO)v?7UgLK zq8HBWX4_E^(Kv!>RiuNm;!H>mUxmeDC74;Bf%`+v+0%*r@T%5B_C2ry?9!L9;CVF8 zU7l_{=3-w(08=Ed6LfiO@hD`<}i0@E?oI+&!vG$c+)WnJ6)fN-)0!&y=ew` zp6t(&Vd}JxJC(UBhvLDPL%F#r?O8OUy`jT7J47HHCOo(gYufi`bLpx!8}+5;pQn#%>e+_z>OYFizi`SsC3zbK?SB^j3=H z(#cS-=QX&s?F-+txdK{Ti(sRV)!;_Q`>aveG~A{$6o!roNaqRDI(y|b3Ew=q-8S_x|chC`<2MqI381z*k`z{{H)*#IjW z*tpUFCw|igNtqAb^Rx(bjV`iPS9;OgST3M4AsMC_AL0e}`lt|74~=aWV$t(B-ps8% zChiQ!4flq^0ADTsw6P*=SumCNr+21iwC%_*TR5Tf*$M1(vkXjHJc8dUiiM}j8~FD0 z#u)AN0T#`ii!-|vpv_}-0P}bFXnrw%biU1N#D^jBTX%NV)D^EZ|A05n+hAe?H;~@G zgmw$2^LO2-A9@BJ5ItB9-Ty`v~p-Ya34(A@&v#2y@;jT0@=Qtb@(n~Kl^mP z3TAh_%(#sUIGK#aaqb+>K03-LCes@Q{Tkup=)+L_bOpVWq>QiUFNKb2)@b=58LubD zVR(!s4BWU2`rfMGF3~H%$xg~A?ey@jP#@(F|d1oVAx1&Dnby>|0 zmaC)68hX>T#}K$0jI8yl2B7gihj)tah!syJ!o|i>FsD45AB{}F*7~c^ce^{rE*{I? zoOQ$9uBR|fu-C%T?l%JeO`#B0Mcu#2%ZhkQZ_@v{|{g5F`tk(eFS}5~= zcS}&&Z#nN{7LOa&r}K^`e_@$gTb4X`I24{(&f@n6z$~LA98dT28cy%c52<#5yPLMd zhqUuJ$}WX@@412{ieI?Pz^i)jQ4gM#OkwRF4~JHp6xjLbrs&k$n~g0}!@H^yT({sn-taxf zeP;KCwbLuu``L4_VUiB?8r2&Q_X}YA3NFE>E@_zVl?%I?9%o;QcHxb8W7wcUrs&Zz zn#ZL#hK=@S*xZN1$m?U-h)F@T&J~Q7Pn94$Z#>t&a~UVC>kTnWK0?43SGMWkDYSK2 z#8XaeLFd#eQ0g%a8m-Oe0}_jYjd=-*PG2BJ!xt>+JkX;z<8Yhu2|QLl3!`Wc@leMC zmLWX{-pAkaRtCvXo$A7_hBk%Cqn2{BGrb`F`(UQLI0c*9T0(tVmsCEN04tB*fE5OD zyrzQ`4}6beF8i*-#t>b)L*)`o-v5nFY(52-v^ohbjwXWI`}uH%_5)5{^Oi4Na|Fxu zkK?39R%luOD%Wk*7YdAQv2kE9j2oWA#JT1W<$D+N3-a*dk_3n^NQGHe!7T4|B8=Sl ziM<*)iSA%9g)2J;<0seKEZMdKC(%C3b(t1e^2rcljwxf0*>A9W*?atw))`91XTUbq z{b;mK5AOE5&Vokw!D{RM*h<=p&M6n+=PuWA(e~G{?!-#W;v;ylwH74ztiUk~q^RBc zCS=~ah@T2>v4@@;u+^%=+=bTLMsA%4eUj$G7Kf(rbU{04HLML!2$s-V(n~fp_X}=6 z63Z07w8kD0LG0GUIWQ(<6PxB910f^RVAB~ju)cB#O0=?Yy4_Q3cIY7lH(rk)H5*GKE*B;zPi2RiF2l5!RKv!3)u@U?RyWilii_eMlOrmg8&Ap z%(f^ImF;K1qAz}!oPP~ehlQhhbr#I2oC4d}M6Ppc8CE`f!-_k{;J3I9{N025c%@$% zC?9DJ2_M_DxL$PkVNE`7uV;&+npJYQzi!YzD`hSk>Hvq_5AhA&`8aps4tSAM4ttu- z=RU1_VfsZ8Yk#&rC|cye&b_N3vCUPmqkUSte0p)1vjUDL!N&(#<7-wmX$E9h=VRCQ`)(r;K3n;ivqrmm9onxsesmYz*_4IP#NIw;pxwJLN8moi*o#2Ty(mOS(dbh;$xGs(zz|>#x>?Evh}g4 z`zu~RZ*!flYzw>Uuf-EOIedh87$!fn;f*BfXn1BTB-A)Tr{ZO}UPBL$Z7yRQB#NNn zeTF%ldjzhF8u7EM+v39udTdG38u%8!oiBO(8r~R>g3$+$V?|68-fhP#e0sPHeeN5; z=}}YJRJzB+S$d8Y?X|{Ry{cr3OwhtNw+$~@Q(RhS6UA7 z_ZRcapC&>}y(~PsVly_aEMyzXY3;e5gn8z+hyT|5zyGawc>i1P;r_SYrF99(HlJ@No^^>1@k)m8fFZPIFjlUI{wd#eio{ z54<|~D=d4F3V6vw4ARYLm;LxOyoVFIB}G6EvXy98|4xGO|UU-H2A$&hw(D!<~L zhgu_Fv19jo!k+iXc*LOH&`&amWxQVsqJ-<*dYvjP*yM~uIyZ#K#*29Lw?(-6VG1;T zvJJa^Ta82GG%$U`U0n0p7WY5DhUZ{EuG*XokIsgJS_28ce)Am$eSg4n!k)kby{T+- z(pV_KhVR8TO1jjwN^QnEEPyQPJV4i@6m1#4md<-ZV* zjDZu6cj1_hC3wl*35R>Apm&xIpB?Xsn!>~5G+YAI2>$@+PB`K7UHJE2_$Pm-T>KMP z6n+UGnpFJwFAG>3NuHW4d~K4TEek2jMfOjYX z_l57{Qg?|byu|l}r8iD}{V)EnZqx*rhUg6}S@SXD!RH4Ce^glK5By(Im5ayU zkEl=`*=F0NS+lc79CP@zl*hi0YWuc%y_l z&O0+L6RoG{ORkjqi^K|wO3J|0)HO7z~niqsLD&ArKX^w zs;#NSG(e=TtSDAj(Evq}wx*hvSV@_wDk!UpnWl!imPkoaO#!IDpr|ZTP}A08>KaNa zVoi|-J*2FzB395;RwPGN4MnD{rKz9>%1UBYk&3#ey0VrA6VvSs+6pR4A~hv#Emd_f zsAz~Zm6?K?qMArWL0O3@YOAYii8ZJ-{!97()B67#z5h)B{?q*b)A+%WL8HRlf?;fU zP_rg(0O>CCJ1+5TG3MIWyn|cr9en10x__&;x^D++m7dIp~mhXEoZJW~l)p2iEpE?z>x_nNT+&Aafp3*MZs9_WB_{?d?thny?x9<(O zoAf!sw~u@J=<`i7^Xl|Q?bu6S zvt?huv1(z*)J7&aUpzg1wqtDS#>$f!J%*cR#w_S@dQ+ds3zEvz>o!U&OJ+CIs*c$( zQpf1jW{FB<3yYrPy4oK+zE`?m!@O1Z9k;!EUs~h;KH53_^^C=F(IH#L8;sANr6Rhp z@C)XqyomJK{BhIg+;`*0oS*h@4Eq;FCHJjVu2sg^CrF%c(QLfU35--X{L9})OMR%n!wlS8RAlbw=q##Y65@1xfFF4cx-pkEK|b;ei*f`R>ASN-A3;u5 zzF727kd@4?s~-vS5;FMWIYDMF&+kws$j#WYka2?SY|6|OG)dU(U*rA5A4!?p~N%tKb7x)5&wVn{!ja>@ovqUHEH#u*8+%%j!bOQ)V0}< zjBSEqM?^=tMTFKm{J;g&CV}3@8Ql&X;|OBtx8U|8yx>^}uSI|Q3t@%NukdobHah5x zRG22{HqI`tP28GFn>BCIvQ>wUojkodcj?-#dyk&IynFlf@$Ku^um6C7g9Zl$hlGX= z9}ylga#ZB#sOXq6v18-n6UL2CoFL1ig$;zn$0mfy>MGCY|LgyM)2~WjOqkTBLr#`a z|FSP{*Pk7ES2g*?8n=Dl=L9Pn4eOQz!`3W2zR72y&A!5Y{npHUVHVqi+j3W{p#DymxA8k&TP2vs6fjZm#0<@%q+ zSEvo}LpxWh#pSaAIU>Xr!U2Hs`bZ5a8Eg8A0&JWb?_rtIz|DO z4v=%=ho4YyL3ytvzsf)Sg!<=G z53^6DZXb|WS7!pVbEC}ofTnSne_z(;r2p|X~2qTCfh$2WJm_{(4;QM|tm>v*A z2Z9KKSp+)?9ud4C_(ss_pcr})#1Rw`utQYF95Lh*Tp=hTC?%*Qct!Az;3I*~5iuAO zm=QD}a3XLcXhCp>;2J>*K`Fr#f@cJ;32F#9fyz-aq!MHj>?1fvV0By!4GCNcJP5o9 zx)by!7(ftAFp6MWt{74X_7mh1^gbzuxdaCZt`giPSbvJjcAC;6m`f0pFNSdhT`m(1 z3&apfFzKoorW0Hy0Geet+)Lr}D1G9g2gNU>M!WSIm6LGazMg&894LyA-c{+k$4D}I zd)MiV;6a<}mSrNlcblygLA zP+X9WOn;%a4h@BPuC5`&M^N8HxX>Rvck=bK8Q7@<{e-ID-3AM8pMG=eCJP6T>&ERS z3#am%TTfXyYA1E_=qU?l@|&BFES%NvZnAIxl0!3ZKRv!5)S2f2A9lUuA% zSD^d773B4l;Wk1S4b-o|OZFp-O+s{J+~`np7y51~v0NV4X2OICp}|BN$d6Nympe8t z#HL#ZS>A=exeb=(eY>ukpFCVCxyi~X#PyShqkcs078gmk9?~aX0b0@+;7qs;q13;~ z^AqsF@;DykR%l6K#>?xavqAwe(Dti+%vJSM()}$x3R4%Cxa)vxrUV+Mn?i#mGq4D+2NKo})T>nUlw*_v6g7*ujhWPbO^e~sX8p#T=2 z3_!Kg5Cpd}W2&31yi`7lC#3T;te|C+Tix`TsT!EZX@hB~7MS{Jf+^A6G}Wk7;-m)V ztQlxlsh6r2D(5N2CR>5t50 zryVG`$s%W5~#T;#YpNYf!4d<%Piz8t9Por4zhI2 zlt6>&!jDo2b(4jY^%15&`-nUtuB9SqN~1xOjRYkMB;z0H7?OHo>Vu3x!By_IK?o~z zv-s&&D!5tG>Vwpb>SaXrsuNZs0%c|7_OF0TjHapqthY6jL)Q?OqvR^<3#m?w-U~B|Qv{<>>NotvU?dfR5oOHuNgn+Og!{a! zbYpY^$<0I!OqliG(~`OC|J_|vsJju>-9T1%Nn>>|m)cOfH2udmmrwPOhpA6tO#U%U zj!;*b+>z{1`3#7625uxnvVMTtYp4qK1IpA7D1oV)Q7JQ21;ZJC)}HcdsR{ORy}&-S zC)iWJYR^2uq{^t&pinPQhiE47Nk>HC996+g>cGrceWp>RR$8}@5R4VFKKN`SR=OD= zU^{iGljVJFU0j~VcQ9ig;LkKRkl{l@x|E*On)(t8_%Y^G3bc^%*iu%OQUPzM29h{s z8Vi&_;-?4_sRBs!3`>Qw3c9;omNjJkgru=5n8!)LJk*3}ZcOwvfFJcr5z?whD`LzA ze)NeR)K08hXh4hV#^6%!0QNT>!SXDf<%x3!l~5_fydypCJwVSX^7_@qS$#FA&l-VI zl|iXqp-!GwjAo#QtGW*}B|eZ6ZYm9=esn0P3$kdd3AShL!8XngY(s6qmgK>fS%IX= zxKt*q0>4iGonLaMVhebilLe6Rlx>B!oNgxZM-wG(4%Cq~px4CL)Z zkmEQdFbP!z6F&top~-+C6S6TqP7G?HB2bjl%w9`O{geTSg!(k1`yArx(VLj&(1_Y; zBXX}-WmYOFG|rRNN61fFU)~n0^hdNI0z0*~cw$ezNQ|6{s^f~?5Odv9at{K*{LE9*h?+ZN!QZwZZZtiUGI8Z6W6gK1I&FdT0K zI^lGtuT~e5xM`AJ(*$fnUBO1`LhtW2{9F5TC7EPtMv(T&7#38Tz|7kcn3!)02|1)U zWtv0(^m@=E$pWO~Ex|tA3e;F9U>hu91MQnkucUW`ZW}{Vz6ngrk-+#&Q;117gHcK5 zFnoMH2oAS^deUwrJMMqT4$;p_3H0LhsZHvEUXi*?X9yJ9Oam1#3^fEpDalI_=?pP- z{A6RS5&SuJZJ>BeM+tOjywjoaPRC87)LIyGs2wX(JFdFNKtcmt4xO*Irm%H!W~>6n z<+@-Trvt{J+F+cm<72HT$ems1UGwXdw#A|KNm1$jX_q!K)JurKS*qpK`+#W=;BO$Rbx7z`O8l(Pc9@+ zc7K;gSzcB@^Qsc^lIhx^)CUcvaqX9`T`KgsvV1})pJ2*|`iK7M;x|LJeg|Hq%cnS5PQhku5{x0>*T!Y#e0qHX4q|2DQ{TvNq zm^$e)slW6B>j6qIpjsKa+*AR@v#MZaE`lP0@iXN-tcy!*g}DZe=`li2D=+sfDn}rJ z2Z7w*>No$T;fT{~4|!jp0(#D3}t{CP$&(Rx~Kc z#-}(n=4vg17y|QI@-o)NnU)B&V%1`-b(KJuXrM+kP$U{`uo6KI!NA%$b#a;AP)>Q0 zEyF0ZR&S^x`U+!nIgKrK`b&u=$)nT|bh3YqenR=E8o+b}KV8sC{pBZVp-ycxT~v=P z68%%ZXhQ}u4~lC=Ac?mG|4&}fx3V+zxZMRh<#&ZPIo+UXW_NH%?*Vp6J;8c>FQ^yp zO?=-*^Otp?SEW;`Rj84t7NZ)dQcFu4qNR|YEKLU*R~c;&p%6kjU3G|#Zff9Gts-iC zQ%zJqR9$51ry)|2>WKn_MX-P%d^XWln2(jKiUhn3jTMswH%jwQylx!19%9ezLv5M8 z)P~tJ3-(j;YRgtie3XZyFrf`7Tzv{h8qy#7N}&+0sUnTV3q_>s#i-TBcO`ns%bz4_ zTs}`!|LlB`Y3Kqff2v3)K?I!$Z05+zS{Iju)g!ugAi8!Wx^^PEdJdM*7&x(bUrOqts3Y5Mk71@BNR3TyIfUPfh<(M?Kv&IA!GA;=TTBG59< zT88f-x7)Sl6a4Gqb>lEI($(TDz$~;L=~^bBU8PwnjI;9e&0)hN5d==AbEC|QBBfEX+D&y6C<1d6#eQm1UU*6!kVd3 z`HaEL&xrI&Loj=1P(>PNj9hjMXb-#y`pp!<+1fJJ#pSjIVV*-a1~>H>dA@p-uP)`Q z0|rHuuN}>;nBgz_3iICD`B%D-zo6rU63}>LLgSH%8|7b0`m+h?JK6NRP{&m^#)PUv z%rX(&BM3+$dMPS^VjQjH{pqf$0Gj10pyHb>qr)iF%|Lg>eR6kM&H z)xf!01re-0x?<3MOcn)Kk|{?Oa4e_3`KB6Z zo~8bhY(9ajDK5b@A+D|h=*H20G(Rnwo81}_EUZma2vZlY8&A@Rc*45;ZR{52BGxp2 zm5^;nh2FyRSto+`1m(49*2N`O!aUjpeo3EvJP_ti^0~dKFx~|I82j_c{Rhuo3q`P+ z;7^|a=3a;Ag%sA~I*l#!<@EX;|2xlrOGnUUi03;f{#$~*vNV42{I{@F#=1D`VhmkA zG3Zc9eeG>AG|5*0#~ixbAd~L3N>_$@Nkqr-q;rMS7C%PwY-+65)=H%Fn}U&_gluUv zzswYYkZ zRBlY;qB*GhnNdEbPx_0nC z=-M*C0$^l zyxw(jd0T2qZOM(=66xop=lwa($aF!O{??52H%haP{uW4i%JnyT-(6}!{io?q{Y{WF zxjm!_*#w+rHUU|`D8#8R=&a3t>29@smdsWs^E3RrpO7Bud=l1%?(k44RVtK8wM<_Z z>~q$p3SfG+6{tvCLsd1&XpIOAlI3--i%V=t&yFKKJCyWnsa($%$~Ew3dFxYoX>Lw3 zB)FH>y6cjzt62C;uM=#0){aWxc-DsIy|y%Oc7!}-F^p9a!@}Bp>*DgZ9`vhTwf4y> zYU^^p1%LDNpynZ`p#_!6^ktAoC~ss=t%>Bm!NCJRmWr@qorP&3AHpqRj38myWib z`1#K|ngZ3`gYvKv@}ah@M>aT_ZMIM`PbNp?ZrxM`n#O679;*$SG{z`MC9pvvh6e;1 zi{-qpi%ZOvC>)iyh-OP<)Bcf;qyhEytUsu^%Igb659^*<&@r6Y+gXreT zq=ukBz7bvB*%&-piy?#{Qpjhb5={JL4Y8H=$rj&0=C06&){tw;d+fsd+ z-!-6qi)_|XdjM}SI1;o?k<;xr{2%fU>>-AA1V8exi_7hE>SUiIdp+qMrlfnA`jVaA zR+-wKgxZ}67}K~d=xYKGQUqQKbRk`7?;xVbf*d`YE6PB!_{4L?42m^r?eOXwG5EhJd=OnymkF736Jz9t^l`2j28% zfLBgKXq(vxn$kJi#z_ufG2RjM!<~peAz(E_3_S?$3w0B8gikiKo?wRIN4 z{KRE47XZB%ieV^0+f+GS{=|Pv`yY6|cN*>AAox+I-|$-g6)qLS%w@m$R~MHwP^P)9 z8O?2J4XE^&9YDrE16sc({;3fEQkK)6logalZ8?9#YxAjEDTYm}e&zEUUMH=+t4W^L z{7S1XE-|LH_tal~nupNW2x|_fe^~o#`#-_mkk&(DuZ46?-M zkz81+fhEncO>QcZj!Cu&N>72tEuU;Lj3D?Xq$lWBl&65NBT!i?&*OKT1eVeOO5?Y< zRF}HA+-9N$61U%V4rZYS7G#UEaQoc?DWi*H}-b`x|bq0_J3M&=%+-qam#=9uY$*!R86_`u&az`lq~p zK;ePQfiW)16&GZnHB@E~On5R?4s%&|&in0xo zP|{neX0C;l9-z$cklT;OK31t#kng<%WgNeu94a6RNoW?E@+q`z6pU5`eYMis#^O5; zpYfENkSSkwdZxTnXE|vVAa$Dcoq_)(`fw)ggWIp7bKw* z+RnH0E}*~Q_?430%Ih|0Jr{*CPH^4%W%!gk<>@1jomFL!nob#L1M!!>S5#Vd2ijUi z9+Zah1<9AO${0F$-C9jPl+3isw4)^veC#^P?eu2S$}S=uoOW{SYbP%`%gQ(VZkH81 za3SqLJCp@c`kU1kUUxz(dF2(10a`(ce;M-{qRfm;zj%y{nQrFUZ6<5+1DV5=t)+GJ z38MA*H=vM&GFELflw54p(`jq@S;T;3js&S&NKMU8>xfx-t#PZpHd{*)^c|v*6s4_Z zGzG2D22y9c=nSnYz}=qoJ?W8_>qFQrRrVoJmz0tGB(IyHGbg1JPTTkU71b?(pSM(R|(4UQjHnv_=oE4>5_ zfKzWNKBe+n(#4iCP%d1LeYK&Q7g&^CWxXyZ&Fr@*B*h0(&pNkdbp^rsA3C2uKy_c5;zFt5-?z3ou45F2Ft($8kD zZ=^uVB|l}2fY?Id3(7*7!0U2bTk)?D`%5d`@t5O~^j&>LI>!yO4CN%vImXHHsQqi^ zu!1pCzWE#4;J7EgZoi6e=_|*pz*cJxJnJIQX}gqb7IF+NLzCe6cVNr)i}D@J#lOhg zNt=*@R%nBEkhLQ1cVKsd`gbO+M01`+o>0m;kGVggrF|^B9qr_GGj#0B{li?xkoLu| zyq9HnqDk&$Nv-(gH1v2W0-`{(iH5ROYw!eiQ-^kPpqUgZps< z%PhYrniQLRa@#~#^BS6$GZ&BWdIk2Q*rdt%uAIwPa9-X180lz|c`IonpM6ZuujT&w zBs6oMe+q4bz#7t^14_7;zH}A!LOE1G6q3*kDQJZ@XcwiPPRgifDFXr8D&hQW08E67 zpcz)dr%>Eltd4=RAPM)vpI{U0_Gqy>62`$ySO~4K5sH3atOmh(a22eAkD$*Viq+4c z2JVCxVJq}|tXPeNS#UEv0h?i;KNhQ>LmjlhYw%Av_VHph4X%cp;9htV{tDZmWK}Wq zQmiIH6mEov;d%HF{tbt&E>OeRK zPJr=n0W`u5um-+^{!cLva1A^OpF_W=nNzqDR>MEw$Tjo@ZiDCGJ2>o_V)aY70iJUI9*nD!2-6hu_0numcW#wOE}B7s4WFg?B-{ z#=OAkkbpbjS@;NkfCFErZ8!tMa5=QVbMOJ|fFJ#Zxq}ff394WYG{b}N9BhK`VXt;# zYQm{76%ueGJOt}t3+(wuvHB^DfU_V1SHTik4$s1e@C_8bS*#9$6JR1#z-6!m9)h*- zA^ZdOdyD-OPJ;+6gooh`*aio$r(Y0)%iu0}9NJ+c`~U~O&G7?HgITZ;9)fq^dpP8s zVl@WpU~N;30Suw!;4J7OTN90UDqg9)%A_c!VJOuB;e_==meS{m}Nq7}L2K^D&Fkui(fb$^+ z*TVzw5_|;*e9Zj8Bxr=&U=@4_-$UQctQQEuB3KSj!F#Y3dVRt%3r>M^U=G{@55hXw z4F7>+{>EIuWw0DJ!d{p48Ti%nP1{T6Y@Dh9ry}v6~17RXmLKEB$t*{O@!ge@tYq1&z zLAV0$hCjmFuoVv8#=OEbm;<-MQ?LQHL+^iZEP#nH3vPu~@D_Xr#oMU^PJv&-v^qu|tBz9x)IfE-DpiBjU^PSyRm68zC#vD< zBz3YnMU7A+)v4-ds!WYi+)1RysIh9CI!%pN6Vxvh@!-@MYLYsW`@zmqXRFElj`|!m zRh`TCufJ61sq@tZYC4x_f~rD=)C^Urs#I82tC^}sMbt%Vma0{Cs$Mnl{o}VOr>Js%UHBVj2?RPoxU8k;B3;EsL4eCbqYrb>3 ziQjbIqHa~Usm1DcwM5;aexvSGcd6g1yVdVhO0}qa)V*q{x=-D&9#G5FgKD{YNIk3` zQ7hC+)v6vSMK8eWL!R zK2@KoE$Vaih5Ax`rM^}?Jy3P3Z`F4^_-h-_1KY0tsdlLE)ek%rY$s0y`;R=@OKUE- z7I9g+2X_hX&SmLddJny)-b?ST_tE?661|_^U-#DBKg4~62kO4MpFW5?-w)A;a#z}q zbwK}wyWkJghwCHsk=%iHls;M?qmR|c=>dA6K3IxmwGjye{(qUb#XX+ZBN_UZ-MYPE}U9TH-R9~!PI<6DCQP0+M zbd#Q|FVVl!^Yo?qGCf}>_2v2seWkuiU#+jv*XjlOI(@xfs2AxQ^o{!0x>?_(Z`QZy zTlH;vvA$g|(Rb+I=sWdY`nURS{X3n~E&3jPuU@L})A#EK^fLXRUalX~59>$t3cXUd z>PPkO^&j+O`j7f?y-KgvPv|H0Q~GJWMn9vU)ouDY{U`mrUaSACU(he=b^0a!vVKLs zs$bKu>%ZuBqM^O1-_q;#+xi{-SN*PjPrt7}&>QrJdZXT?JM>5TW4&2_qW`8p)t~7t z`g8q-{!)LXzt(@(-{?;Lt^Q7L)!T@xyj}lO@6g}tAN0TUPW^BFAN^l;er*^=kx^{) zFm^L`H+mYqj6IA!4W4IZ>|^X}lo)2_{>EX(;l>fhk;YGrql}}CV~k^sw=*f za}(jXPv(qpbwey%U+0ru6*lWEoEr>P%X1~Vs3TYvPJ}9J!c|>V=D2lHYq-8p&+Odp z)zMYYoXWb{vq(G`njMPNhGx`;ea1Q~Jh#wBA$w-H-luF`I35qp44dVHb)hC7xB6(~ zj6!YH$HSF{^5cn6!fGU|fyx@Tq3aPbUaKq5$7>b&IeBl4Ja4bf@8{IbDkI@Ub+?9N zI(BPJZqHrmMYl$0R-U^y3vVp5i09(Vn>)ufcOiN^7F?9xMZ6cNkFV!q&GYTv$UOG0 zyqb1xJl!0M_b%6z*SIs`yoN3L;^>`!5@o1DsUS!_ta&l*fW0C5)UVW2iUV03NWS=Rra{On>&i9=tJKt}v z?Ce6*m2q(&7hNN^9STpH?c_giwnM?GD>x1Qi-oFv7mMU|F?z}OA9}FMaR&sMnlsj;aEdndgl3o`9}}0 z2D;ogj5+5{bBbB+kX;*`bhcj_MSIcduTWdSNP?t;F ztH`b_5zqDEyc4T6?#YTUJJP!+&qltTo98*W~MtMagQ!5 z!)u79L+&`!iC!i0PKBfc{%a@qP%N+W4!53%RR5(VhdHl9qvzo-ZzWW6O)_XdRX7-` zN?$U}O3zwrSvl3QhPt3Uq1c({{M^R+2p2xnmn^d!q@;i4T;7`PEe4Axm!}e&xe-{19*&8{(V2yLlC9An~YOs=r zRVNA*;}cZ0v7kflsf0P6Oal##3GWK*gKBoa>_p#gIr)CQa`L@9<>dPHDHe(IxYk6X zfrotOEyt|P{29y2_TDYCT)cO^ESCcNUzT6jJ7Jc)$NJ66x0h({!N|+UXP@+P_1H1J z+;aC$FCULx)XS}#2>n_dXmZa-hloaF7K?~J^K6$ukPIJ>2&X;VrTDqW=dXLW@`4A z7p^3a8Z6)J>(K5J?zwfR=MTi4n?I1C9X!iEvN+CiDLZQ|x-+sixI4qEQ&N+ErzAJK zQ?sh7ox`2g1NTbs$jmGQcP3|`@=*J%A-MCaINHt*2hCF|mW;C!-7d~b%gVF%gUnq6 zW`W$DLlXTuP@rM22D6v5RGhc8W^rx0Ho_;EV4RCI#EFqNpY;7IS7=syQ$}xviDa{m+Y^N zvRrb%W^!ldA1B%w)l@~s_bqufCjs&s#S=jZCW<;mBj>jvu@ zIFPw6Y4}wY57)=DzE#X|Y>39YJA$;U{|GWJz9Y!E6dpm^ud5M6L-F{WssbC)aq#U@ z-g#fn9C7);XN{2)tmjH$JQxdmt$BNyiJR9h;_MLY_}SOk@;eZXg{vd!FMqT1)0Y=> zlHI$2$9`pXuF6^DnfKJ(YV5tlZ~mD3Ztn&zU*A>a_UT5Oh4%zkWnCd%aKB@3%=kTS+g3T^voiTsKFP@$cSf(*CpKp)gri>v691%xz=NAUreus?8L)4l#u*v8v7*qpLM1 zJgxmXH$TU(6V5l#GW1}5LuGBKF6z;dw42XVIQd=IPkvBLA*3(Rv)+d0?xGHWld&H~#bw@$x1 zp$gPqaBJk&@4a8-^*Ha=piKKdS-jbWLv_LYt(pCc8mk^(=Nf)P8P0y!?4pER<>V%- z%sFoN{4*E&y72d2555DyJ?}W@>s)wa`xe`U(MB7)J=D;A#1ig{VR0uR=S(P_oVPOEIqpS}PS1Z6NoU0)QE7be z(DZQgv-~=eE-Oc*?6a}lN}38ZKwcLuh(}%%k(rq{TI`%EBqi_dP!e;`4qa&;RXFEz zg{qRSxxcWAyQ}ow)!a^52S;~CbXJfbcxO(I(;F$v$@7N%tX^2F-fIe-`QW>*{BOr{ z>d3j1Jv+BMJ&l`A(OI6uurj3^p4rw%w1V3-T4U|&L2mAMUF&!EGwqW7i7&^+{S8)5 zmd6puwJoSV`&%Eo^qf$vir?p-Fz6)f>+2bzL}mILpF%!9Ys<5~tb2IPO3m-;yk^77 z@R)(M&Z z$i11=ez$UxgYtV`pCV>n{-G?p-n5hZSnlQGyB)loJHFFQ7y*1M5eyb?U zA%C(n*rBrK_$Fm-XyD^Ih~% zvVA+)&HizXDffqk*#juhJI`gD{t%Qiq;$I9pt2nDhn30hV&XH7zC+8nr{Y`wrKY?=e~@x2wTAe*R;1Jp6l}b3nD4;nvB!%MQ+HtX4U%<=iVAbp9AlyhB%y!JG!>TVUDf2$>ZY&<=mXfRnvkN8oO>vh0+_?3!P$}mpL-B^H zNF$F`;%7;YSzFss8H&Y1bDb2qVmxf<;2C`LVf$DqL7t|;7lu{ATCNH@Ig$FoR<1jx zCfww_l;0DCVqxcHbu65=@p3m3;h{*@kAdvE&C@r>jtAwEiBk=aj*5k1bLFPkNFBe$ zwY{8V)`fX5UR~%Sj);Dlk@`#~l`svCE8mt?a<$wp$SZf-b&+@@>%+;U*sS!6XsjU- zu1s(&3{_TgSkKGgT)wKIzBWDAbxsM%m=lZeC<>?I#(H+~ zKH?O~%9x$r1UborecZVlwAw4HKHQMr-0rHPm9_HI4!gVVoLH4CNUxlDJnY##=|g<{ z30vpUMBH6M_84ocFemj@wc+$O=L1gVEceEfUu@XbHP*Z4)LAjSWku?Fsyojd-zm>n zwEp`12fKskWxLYWlU71n;NKa)iT~vpk)$PEY2`ehvFszBv+YWYkrp7W!?f!jbtFqHSc3zvM zlv-q`H`yAs)z0SGm{z-w+v%OQ4z$y&?bjFDI?hgi$9}!m*5$U|W2;mD6*;dL=e$0w zX!6{6B3w7Fv7TE88|q7k3{#`VOdVA|VaQXVI+7{1!ATh>hwhEetBG>h+w8nL$2wM>KKATMV<$TOAED$p8l9_nUMLoODSMS- z538(+DV`pRWtt-;x2}PQpY&A0;OJmH8m^2~M=H}hvpRzGc%mwpm>UgqyJd9)@7|Pd zm>aC+?OUm-qt8BP(v%5jj2$$z)S9~~Dl~&jkv!ux7>>p2iK)_8neRP31=T**^OR8P zsFwr%fr_b><3CSJ4OYv+m2(W9PZ|qFIMNSOv>8dr=>pF|P20gRPeJ8MlU%2%B{L{b zG3=}4=JV>v%tn3$T+iET!yLKMZ?@t|s%A-Rb2?e!`q`0KL%sPESe~@%_Tc8*CN9b+ z%qQ{jq}E`#DO}l@2nVw=enflXM{lE%0d?^Kb0YNvDr1QO_VIW??VtgJ23V7l(L-5BG6kO>yA`R;pnk16Ik z9@o#DB(%t^-&cqDJTtn1H(TCMev)7N zgerA}D|JeZyoHmfwr2LRDa_EQI0FcarH;^JB5~QEmh(jGEM_!oFRmI~d;8>xEbH-9 zr>>^AW5P2UXU+`AoL)LdnE%oLpJ$*g$|GzUKt*rE)RI1ycG#~wZB=%9&ypUN{|w8I zIKSrW)=id{+4*e;7Mba(zP9$WwB%q*+fK04huM0foqv+0$qANL{KD4LEp4A@=@Ppg z;&z(t5PQ?qHak5Tv|bY*(@bxlZz-`Pt=IS2ua{byy2nyyTejV6y^h){=}ufY$44}| z-0~~4HT7V2JstMzHd}M+cx`&%&Fc04{qNv=HVwGr*i0L;O$<0bz<=_$!xBmVzxgLI z?DpwRoSHeDN20&(!&<;qm3j-iY|%dxA5YEY+41OcjCZ`$k1m5H*b+DIGvek+TM|F7WB_$yi}oI< z)H-a@6;MK*qMauzbvU+Y`_Ggbfi3z2OvD!LTgJGs1L(<6Mm;HX)mZw9-G)vlE}zUv1$qtf`NUu1^qo1u@|SphBTl#cqv+x@ET0rQa+2K^ z+W$=EoU#(9?^BSrBwk++iS>hBj`o;L+#YO+&vymvz?L|DXHVsP2-}I#C)+Mb+Sjm- zbcxw_A2EOSx`aNXrx25G3U(QK6tVb*i*3i{ld=+@Zw(wS{^*&+^OLgW=n_auI(i#% z?rN|lCf+mfFt)_SJ0-|iuqBpN3#`SKczBa4ET0N=8Av?MR`l=iE_Np>@$nA%72`r* zoWaK%(%aGTl}Z(pUV**=P1qf13-4?d*lp;sVXIwVw1*TmaGsCx+kxY>6ZI97unhxPg-1Jc~49_dSN~ z#PgH6mAHNq(@$*C{&l>@N8{hg8 z0e)hm2QOsTk~-1(i`ZYJEc(n%tT}wz(EV<=>;Sr83HuT0&FI3rn4?Rv(Xy0Mw^CNL zV<~;c7QNs>LeSzPdhbK{V2i#4%dp$gvmRyaN!A$J<1zYh8S{WvLI698UbmY0l6KJ- zo+9)sb~`$KjZzAqPPFD(=9)UA=$p`q-GRRFyw%Tk^wAeByA2)n8pkR6S&lvkJ@Icv zk9eKA!Y)O7zd>8nA3(Rl0{nT9znb}$HUClc@6bwrI?+2ilv+*M6nf`p%$3+^^OyEq zq494?XS_)?@*QPmjOf6vq+^Q?-p+Q!799@@u*=cSJJ}Z4ooG;Lb(G8-I%PMl){dc$9dKJ4IJ$R*7+pq&@`>R?VemUC_ zE&dB*xq^P8kG^5qZD@}-iARZ#=uPYK!$4yMZbkUq)U9uZ-{Ma`VgD)4S0-n z&LtJ+kyigv&LvG-l=Dr~7QGqPuabn*d=J>AVXb%9XP~LZ$cBc==>iWY5}(B zyRa0yJYc9hz&zfft6|zz#56(!KQUAVw&;;C54#kN!XenACm&|0q1dA5!+7ip^kb0m zc8YzJp|;UhC%X4>hFXMA2|9EjeZUSJZ>ar;Fcz`VJ}1%-vC*$a^7?AZqOXpz>~{3l z@ytIyDRj{}l*OkRoj$`*JFzR!g;0YndP)`j#};h~8^rY_?iRWk9>W&>1lD4AqTkgq z&TH64^@cKLTXqRL8V)C2wErcn32f2BpaQ!Ty$RZ|MOVVR*rJW|7!S7SrJ$}Qt`oW# zO0ZLC#ih(Uw&*4pjxD+aCSr?TaT(heTl9XA^j5UreCCb%1L%C)ZbrYiZIxtAg7`$y zzg@w&DBFpib0uTP7VUMFp*CQP4uei?iIaNb)rMMv-GOeu#!wGqOU%>hAnQkBo?f@W z@{!o3pAxrJd?bG9$m=a1iNAV3$a#gt4c%=a^Mft%LmvgTfPEhgEwXHhQF`JH%n#{h z=t7Wn)r{_aBWs@Y67+R2-)GSw&8$z3=Vj#{T}SLCwDLCQ5L>hs zqS#UN1GoTx(UQfiB`J$0VIH>VJ8&zu=oj!Xw&s^cnaBTl78HiQR!-ON`m|w9DskWxUV078RR% z<0g(r*rNBt6l^}DtHei!s=`j9$8Ki-l|G{{f5LH|^mcSQv2EqtM&jIl2r@sN=%6iZ zJABH}n?EY>8t#?OQ8dV%Hw9)k>H6 zwevvUN0R8_+gKayM-r#@5|DjF;?;f#vi>DjZS)`b-@w{NkJ>?eTx`+t0=5&&RzAB) zOxyTQ+9q9M*7npz=CN90)*engSUGNYqHVhusRTZv@t#F$5w_^j#HC$|EjkX`uq9^g zS0L+3;?@Rj{SBD!edy!1EirVDI*@dH zB$n}Z(>~N$rlu< zKG>qyO((W4w&)udvgWWm(1Ag#4-#j%8l--%ld1D7?6ISFgE@9|S%~pcR`f-96}ugs zcUh5|CieUy^-$6(%XKyNcaXB8J1%D%-OT$tdf*jod+Y#uI&7e<==;!#Eqdl6))hXY z7s3c^(fyj4Pi)b)TiH(7qR&ATTVgI>d7CvqqCZ*8nkHTJ23U(NF_=f+jt{oz9ZP5z zTlBL#*cP|2f1&sO#;Qkj)SX4DFX^I>z;W0Tv$^svs~*uOeoH?|7v24L%mcQ>Zf<}o zY>Cp|NT}y690Ms2k0lq5GM|_97`n@^jje7vjaVp_|IZX zZ0IW6me|nG+P1`pzUe{sDXAYFvfQeZYoKZ_NLh&+y@t5a&9~BL^rRKG4|+9mq?<^W zc+#g4M_P`15>I+2?4(Z7yCoeT(Yb$M{;@^xf--E;x1k(c^dqRj?nE0Ov*s#^{t2W% z5~q40F{I7Dp{s0L;!5{>-0}~g16Hx_siyuu~W=o*l8iGy7Qa_%Qu z{v^k4d_>QI0JiA)P>L;av7=9MjG}(gov;C0w9nJ5NoF~1XYAND=zFjpdjoph zTFYPb=YM8RlRgGr2Zt{v7A5-q3#=LJo#;s~GS95r5$G0JM!M*p>#TZ)qmylW3VMTW zH=}E9Tl78K-hdXrWR(@|XWNIM^FY?8=)-opXq#<|_IlZxhrQ6-ZF>n?`U>w)^i6aM z$XtnDYTM1|2d}aQ@Y#U&ea+fOOttMP=s#X(U&AN)mm+lqsM}c^=>5M}N+tWE!%@Wiv+^}pe7K(PkfH z)?oeT)FbK5B&EuFs7?xhVr8i2(LL08G~&GOG=}0el?a|e{vT_`@|-|i&q=(V!2jd0 z#H~&#)@1%$OgQY){O#V1qP`g`Z`u|C^tEo9bgwF`kK4(%}MAfP=HP@?ZqJJuN zjOkO#x8kKl9u=Lz|B6_kKc%eWKZY_qZq2MGN_`Q^av_($Da=Y(1!$!~RgvCET+x8( zIhWX?2~q>J7@^jf;+uY=iw1~+YNhaPY`V%TJTO zR}#TBKtCmN>ky*2TGmOVIdhRex&Uo7QfCdV$an@yx78RT$Z{3WZd109^xK(pdF9vt zfy`Si|D3UxQ-{oDBfU$wM(#cKVdflXm&u)JuX!Frdzw`$+tKM|W+n0c3TseSgluW< zWut!~dXrfzy^33lNAM`AaNUgBxq+s-+WPp&{*AHvljFpEtP8~l)I};|4e^HR!~pJR zJUJAv8#sGV{{VLgM5?(FWvX?%;mH1j2A1|eb?-d_ff0#VV>}^u*mSeDAyzp`@`I5^ zZuXgL))U}wL@a!9Bdvt1%6V)ew-U?@$J3ea?6KwzBHS=BF+4k58>p54NA?fJC)Cew zm=%uo4>U$bnRg|Q>|f1;Rl@yG9dUfR?(D+p`duD*t&cc9tFI%DPY;^nBaV0G^VITD z<)g-onK0?JY13@ue_oFnBli>bVO6%ZtZQj+dAFsbg%=fkjz)SeuX!Z;$oLf%D{5AB zuIRb4WM$u#ftAUX3syF-T(S~}k{-lS<}cMVRg&tP3Z#xom8OQL%2MM~<*8|@id0Q1 znrccVQwvhfsU@jYYFVl^wK~<7T9;~1y_@PtZAo>ecBE8G&z8O|ftIqC@h#;o6)iQ= MhyVHee=-CA8xgzU4gdfE diff --git a/win32/include/sodium.h b/win32/include/sodium.h deleted file mode 100644 index 295f911cff..0000000000 --- a/win32/include/sodium.h +++ /dev/null @@ -1,69 +0,0 @@ - -#ifndef sodium_H -#define sodium_H - -#include "sodium/version.h" - -#include "sodium/core.h" -#include "sodium/crypto_aead_aes256gcm.h" -#include "sodium/crypto_aead_chacha20poly1305.h" -#include "sodium/crypto_aead_xchacha20poly1305.h" -#include "sodium/crypto_auth.h" -#include "sodium/crypto_auth_hmacsha256.h" -#include "sodium/crypto_auth_hmacsha512.h" -#include "sodium/crypto_auth_hmacsha512256.h" -#include "sodium/crypto_box.h" -#include "sodium/crypto_box_curve25519xsalsa20poly1305.h" -#include "sodium/crypto_core_hsalsa20.h" -#include "sodium/crypto_core_hchacha20.h" -#include "sodium/crypto_core_salsa20.h" -#include "sodium/crypto_core_salsa2012.h" -#include "sodium/crypto_core_salsa208.h" -#include "sodium/crypto_generichash.h" -#include "sodium/crypto_generichash_blake2b.h" -#include "sodium/crypto_hash.h" -#include "sodium/crypto_hash_sha256.h" -#include "sodium/crypto_hash_sha512.h" -#include "sodium/crypto_kdf.h" -#include "sodium/crypto_kdf_blake2b.h" -#include "sodium/crypto_kx.h" -#include "sodium/crypto_onetimeauth.h" -#include "sodium/crypto_onetimeauth_poly1305.h" -#include "sodium/crypto_pwhash.h" -#include "sodium/crypto_pwhash_argon2i.h" -#include "sodium/crypto_scalarmult.h" -#include "sodium/crypto_scalarmult_curve25519.h" -#include "sodium/crypto_secretbox.h" -#include "sodium/crypto_secretbox_xsalsa20poly1305.h" -#include "sodium/crypto_secretstream_xchacha20poly1305.h" -#include "sodium/crypto_shorthash.h" -#include "sodium/crypto_shorthash_siphash24.h" -#include "sodium/crypto_sign.h" -#include "sodium/crypto_sign_ed25519.h" -#include "sodium/crypto_stream.h" -#include "sodium/crypto_stream_chacha20.h" -#include "sodium/crypto_stream_salsa20.h" -#include "sodium/crypto_stream_xsalsa20.h" -#include "sodium/crypto_verify_16.h" -#include "sodium/crypto_verify_32.h" -#include "sodium/crypto_verify_64.h" -#include "sodium/randombytes.h" -#include "sodium/randombytes_internal_random.h" -#include "sodium/randombytes_sysrandom.h" -#include "sodium/runtime.h" -#include "sodium/utils.h" - -#ifndef SODIUM_LIBRARY_MINIMAL -# include "sodium/crypto_box_curve25519xchacha20poly1305.h" -# include "sodium/crypto_core_ed25519.h" -# include "sodium/crypto_core_ristretto255.h" -# include "sodium/crypto_scalarmult_ed25519.h" -# include "sodium/crypto_scalarmult_ristretto255.h" -# include "sodium/crypto_secretbox_xchacha20poly1305.h" -# include "sodium/crypto_pwhash_scryptsalsa208sha256.h" -# include "sodium/crypto_stream_salsa2012.h" -# include "sodium/crypto_stream_salsa208.h" -# include "sodium/crypto_stream_xchacha20.h" -#endif - -#endif diff --git a/win32/include/sodium/core.h b/win32/include/sodium/core.h deleted file mode 100644 index dd088d2cae..0000000000 --- a/win32/include/sodium/core.h +++ /dev/null @@ -1,28 +0,0 @@ - -#ifndef sodium_core_H -#define sodium_core_H - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -int sodium_init(void) - __attribute__ ((warn_unused_result)); - -/* ---- */ - -SODIUM_EXPORT -int sodium_set_misuse_handler(void (*handler)(void)); - -SODIUM_EXPORT -void sodium_misuse(void) - __attribute__ ((noreturn)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_aead_aes256gcm.h b/win32/include/sodium/crypto_aead_aes256gcm.h deleted file mode 100644 index 9baeb3f19f..0000000000 --- a/win32/include/sodium/crypto_aead_aes256gcm.h +++ /dev/null @@ -1,179 +0,0 @@ -#ifndef crypto_aead_aes256gcm_H -#define crypto_aead_aes256gcm_H - -/* - * WARNING: Despite being the most popular AEAD construction due to its - * use in TLS, safely using AES-GCM in a different context is tricky. - * - * No more than ~ 350 GB of input data should be encrypted with a given key. - * This is for ~ 16 KB messages -- Actual figures vary according to - * message sizes. - * - * In addition, nonces are short and repeated nonces would totally destroy - * the security of this scheme. - * - * Nonces should thus come from atomic counters, which can be difficult to - * set up in a distributed environment. - * - * Unless you absolutely need AES-GCM, use crypto_aead_xchacha20poly1305_ietf_*() - * instead. It doesn't have any of these limitations. - * Or, if you don't need to authenticate additional data, just stick to - * crypto_secretbox(). - */ - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -SODIUM_EXPORT -int crypto_aead_aes256gcm_is_available(void); - -#define crypto_aead_aes256gcm_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_keybytes(void); - -#define crypto_aead_aes256gcm_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_nsecbytes(void); - -#define crypto_aead_aes256gcm_NPUBBYTES 12U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_npubbytes(void); - -#define crypto_aead_aes256gcm_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_abytes(void); - -#define crypto_aead_aes256gcm_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_aead_aes256gcm_ABYTES, \ - (16ULL * ((1ULL << 32) - 2ULL))) -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_messagebytes_max(void); - -typedef struct CRYPTO_ALIGN(16) crypto_aead_aes256gcm_state_ { - unsigned char opaque[512]; -} crypto_aead_aes256gcm_state; - -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_statebytes(void); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -/* -- Precomputation interface -- */ - -SODIUM_EXPORT -int crypto_aead_aes256gcm_beforenm(crypto_aead_aes256gcm_state *ctx_, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt_afternm(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt_afternm(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt_detached_afternm(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt_detached_afternm(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_aes256gcm_keygen(unsigned char k[crypto_aead_aes256gcm_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_aead_chacha20poly1305.h b/win32/include/sodium/crypto_aead_chacha20poly1305.h deleted file mode 100644 index 5d671df142..0000000000 --- a/win32/include/sodium/crypto_aead_chacha20poly1305.h +++ /dev/null @@ -1,180 +0,0 @@ -#ifndef crypto_aead_chacha20poly1305_H -#define crypto_aead_chacha20poly1305_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -/* -- IETF ChaCha20-Poly1305 construction with a 96-bit nonce and a 32-bit internal counter -- */ - -#define crypto_aead_chacha20poly1305_ietf_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_keybytes(void); - -#define crypto_aead_chacha20poly1305_ietf_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_nsecbytes(void); - -#define crypto_aead_chacha20poly1305_ietf_NPUBBYTES 12U - -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_npubbytes(void); - -#define crypto_aead_chacha20poly1305_ietf_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_abytes(void); - -#define crypto_aead_chacha20poly1305_ietf_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_aead_chacha20poly1305_ietf_ABYTES, \ - (64ULL * ((1ULL << 32) - 1ULL))) -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_chacha20poly1305_ietf_keygen(unsigned char k[crypto_aead_chacha20poly1305_ietf_KEYBYTES]) - __attribute__ ((nonnull)); - -/* -- Original ChaCha20-Poly1305 construction with a 64-bit nonce and a 64-bit internal counter -- */ - -#define crypto_aead_chacha20poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_keybytes(void); - -#define crypto_aead_chacha20poly1305_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_nsecbytes(void); - -#define crypto_aead_chacha20poly1305_NPUBBYTES 8U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_npubbytes(void); - -#define crypto_aead_chacha20poly1305_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_abytes(void); - -#define crypto_aead_chacha20poly1305_MESSAGEBYTES_MAX \ - (SODIUM_SIZE_MAX - crypto_aead_chacha20poly1305_ABYTES) -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_chacha20poly1305_keygen(unsigned char k[crypto_aead_chacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -/* Aliases */ - -#define crypto_aead_chacha20poly1305_IETF_KEYBYTES crypto_aead_chacha20poly1305_ietf_KEYBYTES -#define crypto_aead_chacha20poly1305_IETF_NSECBYTES crypto_aead_chacha20poly1305_ietf_NSECBYTES -#define crypto_aead_chacha20poly1305_IETF_NPUBBYTES crypto_aead_chacha20poly1305_ietf_NPUBBYTES -#define crypto_aead_chacha20poly1305_IETF_ABYTES crypto_aead_chacha20poly1305_ietf_ABYTES -#define crypto_aead_chacha20poly1305_IETF_MESSAGEBYTES_MAX crypto_aead_chacha20poly1305_ietf_MESSAGEBYTES_MAX - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_aead_xchacha20poly1305.h b/win32/include/sodium/crypto_aead_xchacha20poly1305.h deleted file mode 100644 index 6643b0cbf5..0000000000 --- a/win32/include/sodium/crypto_aead_xchacha20poly1305.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef crypto_aead_xchacha20poly1305_H -#define crypto_aead_xchacha20poly1305_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_aead_xchacha20poly1305_ietf_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_keybytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_nsecbytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_NPUBBYTES 24U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_npubbytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_abytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_MESSAGEBYTES_MAX \ - (SODIUM_SIZE_MAX - crypto_aead_xchacha20poly1305_ietf_ABYTES) -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_xchacha20poly1305_ietf_keygen(unsigned char k[crypto_aead_xchacha20poly1305_ietf_KEYBYTES]) - __attribute__ ((nonnull)); - -/* Aliases */ - -#define crypto_aead_xchacha20poly1305_IETF_KEYBYTES crypto_aead_xchacha20poly1305_ietf_KEYBYTES -#define crypto_aead_xchacha20poly1305_IETF_NSECBYTES crypto_aead_xchacha20poly1305_ietf_NSECBYTES -#define crypto_aead_xchacha20poly1305_IETF_NPUBBYTES crypto_aead_xchacha20poly1305_ietf_NPUBBYTES -#define crypto_aead_xchacha20poly1305_IETF_ABYTES crypto_aead_xchacha20poly1305_ietf_ABYTES -#define crypto_aead_xchacha20poly1305_IETF_MESSAGEBYTES_MAX crypto_aead_xchacha20poly1305_ietf_MESSAGEBYTES_MAX - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_auth.h b/win32/include/sodium/crypto_auth.h deleted file mode 100644 index 540aee0e8d..0000000000 --- a/win32/include/sodium/crypto_auth.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef crypto_auth_H -#define crypto_auth_H - -#include - -#include "crypto_auth_hmacsha512256.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_BYTES crypto_auth_hmacsha512256_BYTES -SODIUM_EXPORT -size_t crypto_auth_bytes(void); - -#define crypto_auth_KEYBYTES crypto_auth_hmacsha512256_KEYBYTES -SODIUM_EXPORT -size_t crypto_auth_keybytes(void); - -#define crypto_auth_PRIMITIVE "hmacsha512256" -SODIUM_EXPORT -const char *crypto_auth_primitive(void); - -SODIUM_EXPORT -int crypto_auth(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_verify(const unsigned char *h, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -void crypto_auth_keygen(unsigned char k[crypto_auth_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_auth_hmacsha256.h b/win32/include/sodium/crypto_auth_hmacsha256.h deleted file mode 100644 index 3da864c7d2..0000000000 --- a/win32/include/sodium/crypto_auth_hmacsha256.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef crypto_auth_hmacsha256_H -#define crypto_auth_hmacsha256_H - -#include -#include "crypto_hash_sha256.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_hmacsha256_BYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha256_bytes(void); - -#define crypto_auth_hmacsha256_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha256_keybytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha256(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -/* ------------------------------------------------------------------------- */ - -typedef struct crypto_auth_hmacsha256_state { - crypto_hash_sha256_state ictx; - crypto_hash_sha256_state octx; -} crypto_auth_hmacsha256_state; - -SODIUM_EXPORT -size_t crypto_auth_hmacsha256_statebytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_init(crypto_auth_hmacsha256_state *state, - const unsigned char *key, - size_t keylen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_update(crypto_auth_hmacsha256_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_final(crypto_auth_hmacsha256_state *state, - unsigned char *out) __attribute__ ((nonnull)); - - -SODIUM_EXPORT -void crypto_auth_hmacsha256_keygen(unsigned char k[crypto_auth_hmacsha256_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_auth_hmacsha512.h b/win32/include/sodium/crypto_auth_hmacsha512.h deleted file mode 100644 index d992cb8163..0000000000 --- a/win32/include/sodium/crypto_auth_hmacsha512.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef crypto_auth_hmacsha512_H -#define crypto_auth_hmacsha512_H - -#include -#include "crypto_hash_sha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_hmacsha512_BYTES 64U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512_bytes(void); - -#define crypto_auth_hmacsha512_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512_keybytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -/* ------------------------------------------------------------------------- */ - -typedef struct crypto_auth_hmacsha512_state { - crypto_hash_sha512_state ictx; - crypto_hash_sha512_state octx; -} crypto_auth_hmacsha512_state; - -SODIUM_EXPORT -size_t crypto_auth_hmacsha512_statebytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_init(crypto_auth_hmacsha512_state *state, - const unsigned char *key, - size_t keylen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_update(crypto_auth_hmacsha512_state *state, - const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_final(crypto_auth_hmacsha512_state *state, - unsigned char *out) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_auth_hmacsha512_keygen(unsigned char k[crypto_auth_hmacsha512_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_auth_hmacsha512256.h b/win32/include/sodium/crypto_auth_hmacsha512256.h deleted file mode 100644 index 3fb5263892..0000000000 --- a/win32/include/sodium/crypto_auth_hmacsha512256.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef crypto_auth_hmacsha512256_H -#define crypto_auth_hmacsha512256_H - -#include -#include "crypto_auth_hmacsha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_hmacsha512256_BYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512256_bytes(void); - -#define crypto_auth_hmacsha512256_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512256_keybytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -/* ------------------------------------------------------------------------- */ - -typedef crypto_auth_hmacsha512_state crypto_auth_hmacsha512256_state; - -SODIUM_EXPORT -size_t crypto_auth_hmacsha512256_statebytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_init(crypto_auth_hmacsha512256_state *state, - const unsigned char *key, - size_t keylen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_update(crypto_auth_hmacsha512256_state *state, - const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_final(crypto_auth_hmacsha512256_state *state, - unsigned char *out) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_auth_hmacsha512256_keygen(unsigned char k[crypto_auth_hmacsha512256_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_box.h b/win32/include/sodium/crypto_box.h deleted file mode 100644 index e060dd29fc..0000000000 --- a/win32/include/sodium/crypto_box.h +++ /dev/null @@ -1,177 +0,0 @@ -#ifndef crypto_box_H -#define crypto_box_H - -/* - * THREAD SAFETY: crypto_box_keypair() is thread-safe, - * provided that sodium_init() was called before. - * - * Other functions are always thread-safe. - */ - -#include - -#include "crypto_box_curve25519xsalsa20poly1305.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_box_SEEDBYTES crypto_box_curve25519xsalsa20poly1305_SEEDBYTES -SODIUM_EXPORT -size_t crypto_box_seedbytes(void); - -#define crypto_box_PUBLICKEYBYTES crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES -SODIUM_EXPORT -size_t crypto_box_publickeybytes(void); - -#define crypto_box_SECRETKEYBYTES crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES -SODIUM_EXPORT -size_t crypto_box_secretkeybytes(void); - -#define crypto_box_NONCEBYTES crypto_box_curve25519xsalsa20poly1305_NONCEBYTES -SODIUM_EXPORT -size_t crypto_box_noncebytes(void); - -#define crypto_box_MACBYTES crypto_box_curve25519xsalsa20poly1305_MACBYTES -SODIUM_EXPORT -size_t crypto_box_macbytes(void); - -#define crypto_box_MESSAGEBYTES_MAX crypto_box_curve25519xsalsa20poly1305_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_box_messagebytes_max(void); - -#define crypto_box_PRIMITIVE "curve25519xsalsa20poly1305" -SODIUM_EXPORT -const char *crypto_box_primitive(void); - -SODIUM_EXPORT -int crypto_box_seed_keypair(unsigned char *pk, unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_keypair(unsigned char *pk, unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_easy(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_open_easy(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_detached(unsigned char *c, unsigned char *mac, - const unsigned char *m, unsigned long long mlen, - const unsigned char *n, const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 2, 5, 6, 7))); - -SODIUM_EXPORT -int crypto_box_open_detached(unsigned char *m, const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6, 7))); - -/* -- Precomputation interface -- */ - -#define crypto_box_BEFORENMBYTES crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES -SODIUM_EXPORT -size_t crypto_box_beforenmbytes(void); - -SODIUM_EXPORT -int crypto_box_beforenm(unsigned char *k, const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_easy_afternm(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_open_easy_afternm(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_box_detached_afternm(unsigned char *c, unsigned char *mac, - const unsigned char *m, unsigned long long mlen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_box_open_detached_afternm(unsigned char *m, const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -/* -- Ephemeral SK interface -- */ - -#define crypto_box_SEALBYTES (crypto_box_PUBLICKEYBYTES + crypto_box_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_sealbytes(void); - -SODIUM_EXPORT -int crypto_box_seal(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *pk) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_box_seal_open(unsigned char *m, const unsigned char *c, - unsigned long long clen, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_box_ZEROBYTES crypto_box_curve25519xsalsa20poly1305_ZEROBYTES -SODIUM_EXPORT -size_t crypto_box_zerobytes(void); - -#define crypto_box_BOXZEROBYTES crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES -SODIUM_EXPORT -size_t crypto_box_boxzerobytes(void); - -SODIUM_EXPORT -int crypto_box(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_open(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_afternm(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_open_afternm(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_box_curve25519xchacha20poly1305.h b/win32/include/sodium/crypto_box_curve25519xchacha20poly1305.h deleted file mode 100644 index 26a3d31efa..0000000000 --- a/win32/include/sodium/crypto_box_curve25519xchacha20poly1305.h +++ /dev/null @@ -1,164 +0,0 @@ - -#ifndef crypto_box_curve25519xchacha20poly1305_H -#define crypto_box_curve25519xchacha20poly1305_H - -#include -#include "crypto_stream_xchacha20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_box_curve25519xchacha20poly1305_SEEDBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_seedbytes(void); - -#define crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_publickeybytes(void); - -#define crypto_box_curve25519xchacha20poly1305_SECRETKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_secretkeybytes(void); - -#define crypto_box_curve25519xchacha20poly1305_BEFORENMBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_beforenmbytes(void); - -#define crypto_box_curve25519xchacha20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_noncebytes(void); - -#define crypto_box_curve25519xchacha20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_macbytes(void); - -#define crypto_box_curve25519xchacha20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xchacha20_MESSAGEBYTES_MAX - crypto_box_curve25519xchacha20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_seed_keypair(unsigned char *pk, - unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_keypair(unsigned char *pk, - unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_easy(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_easy(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_detached(unsigned char *c, - unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 2, 5, 6, 7))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_detached(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6, 7))); - -/* -- Precomputation interface -- */ - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_beforenm(unsigned char *k, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_easy_afternm(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_easy_afternm(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_detached_afternm(unsigned char *c, - unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_detached_afternm(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -/* -- Ephemeral SK interface -- */ - -#define crypto_box_curve25519xchacha20poly1305_SEALBYTES \ - (crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES + \ - crypto_box_curve25519xchacha20poly1305_MACBYTES) - -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_sealbytes(void); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_seal(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *pk) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_seal_open(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_box_curve25519xsalsa20poly1305.h b/win32/include/sodium/crypto_box_curve25519xsalsa20poly1305.h deleted file mode 100644 index e733f49995..0000000000 --- a/win32/include/sodium/crypto_box_curve25519xsalsa20poly1305.h +++ /dev/null @@ -1,112 +0,0 @@ -#ifndef crypto_box_curve25519xsalsa20poly1305_H -#define crypto_box_curve25519xsalsa20poly1305_H - -#include -#include "crypto_stream_xsalsa20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_box_curve25519xsalsa20poly1305_SEEDBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_seedbytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_publickeybytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_secretkeybytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_beforenmbytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_noncebytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_macbytes(void); - -/* Only for the libsodium API - The NaCl compatibility API would require BOXZEROBYTES extra bytes */ -#define crypto_box_curve25519xsalsa20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xsalsa20_MESSAGEBYTES_MAX - crypto_box_curve25519xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_seed_keypair(unsigned char *pk, - unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_keypair(unsigned char *pk, - unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_beforenm(unsigned char *k, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES 16U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_boxzerobytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_ZEROBYTES \ - (crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES + \ - crypto_box_curve25519xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_zerobytes(void); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_open(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_afternm(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_open_afternm(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_core_ed25519.h b/win32/include/sodium/crypto_core_ed25519.h deleted file mode 100644 index 3eae00c456..0000000000 --- a/win32/include/sodium/crypto_core_ed25519.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef crypto_core_ed25519_H -#define crypto_core_ed25519_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_ed25519_BYTES 32 -SODIUM_EXPORT -size_t crypto_core_ed25519_bytes(void); - -#define crypto_core_ed25519_UNIFORMBYTES 32 -SODIUM_EXPORT -size_t crypto_core_ed25519_uniformbytes(void); - -#define crypto_core_ed25519_HASHBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ed25519_hashbytes(void); - -#define crypto_core_ed25519_SCALARBYTES 32 -SODIUM_EXPORT -size_t crypto_core_ed25519_scalarbytes(void); - -#define crypto_core_ed25519_NONREDUCEDSCALARBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ed25519_nonreducedscalarbytes(void); - -SODIUM_EXPORT -int crypto_core_ed25519_is_valid_point(const unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_add(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_sub(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_from_uniform(unsigned char *p, const unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_from_hash(unsigned char *p, const unsigned char *h) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_random(unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_random(unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_scalar_invert(unsigned char *recip, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_negate(unsigned char *neg, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_complement(unsigned char *comp, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_add(unsigned char *z, const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_sub(unsigned char *z, const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_mul(unsigned char *z, const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -/* - * The interval `s` is sampled from should be at least 317 bits to ensure almost - * uniformity of `r` over `L`. - */ -SODIUM_EXPORT -void crypto_core_ed25519_scalar_reduce(unsigned char *r, const unsigned char *s) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_core_hchacha20.h b/win32/include/sodium/crypto_core_hchacha20.h deleted file mode 100644 index ece141b09b..0000000000 --- a/win32/include/sodium/crypto_core_hchacha20.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_hchacha20_H -#define crypto_core_hchacha20_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_hchacha20_OUTPUTBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hchacha20_outputbytes(void); - -#define crypto_core_hchacha20_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hchacha20_inputbytes(void); - -#define crypto_core_hchacha20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hchacha20_keybytes(void); - -#define crypto_core_hchacha20_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hchacha20_constbytes(void); - -SODIUM_EXPORT -int crypto_core_hchacha20(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_core_hsalsa20.h b/win32/include/sodium/crypto_core_hsalsa20.h deleted file mode 100644 index 4bf7a48786..0000000000 --- a/win32/include/sodium/crypto_core_hsalsa20.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_hsalsa20_H -#define crypto_core_hsalsa20_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_hsalsa20_OUTPUTBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_outputbytes(void); - -#define crypto_core_hsalsa20_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_inputbytes(void); - -#define crypto_core_hsalsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_keybytes(void); - -#define crypto_core_hsalsa20_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_constbytes(void); - -SODIUM_EXPORT -int crypto_core_hsalsa20(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_core_ristretto255.h b/win32/include/sodium/crypto_core_ristretto255.h deleted file mode 100644 index f2820e5576..0000000000 --- a/win32/include/sodium/crypto_core_ristretto255.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef crypto_core_ristretto255_H -#define crypto_core_ristretto255_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_ristretto255_BYTES 32 -SODIUM_EXPORT -size_t crypto_core_ristretto255_bytes(void); - -#define crypto_core_ristretto255_HASHBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ristretto255_hashbytes(void); - -#define crypto_core_ristretto255_SCALARBYTES 32 -SODIUM_EXPORT -size_t crypto_core_ristretto255_scalarbytes(void); - -#define crypto_core_ristretto255_NONREDUCEDSCALARBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ristretto255_nonreducedscalarbytes(void); - -SODIUM_EXPORT -int crypto_core_ristretto255_is_valid_point(const unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_add(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_sub(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_from_hash(unsigned char *p, - const unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_random(unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_random(unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_scalar_invert(unsigned char *recip, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_negate(unsigned char *neg, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_complement(unsigned char *comp, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_add(unsigned char *z, - const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_sub(unsigned char *z, - const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_mul(unsigned char *z, - const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -/* - * The interval `s` is sampled from should be at least 317 bits to ensure almost - * uniformity of `r` over `L`. - */ -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_reduce(unsigned char *r, - const unsigned char *s) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_core_salsa20.h b/win32/include/sodium/crypto_core_salsa20.h deleted file mode 100644 index bd79fd9f54..0000000000 --- a/win32/include/sodium/crypto_core_salsa20.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_salsa20_H -#define crypto_core_salsa20_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_salsa20_OUTPUTBYTES 64U -SODIUM_EXPORT -size_t crypto_core_salsa20_outputbytes(void); - -#define crypto_core_salsa20_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa20_inputbytes(void); - -#define crypto_core_salsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_salsa20_keybytes(void); - -#define crypto_core_salsa20_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa20_constbytes(void); - -SODIUM_EXPORT -int crypto_core_salsa20(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_core_salsa2012.h b/win32/include/sodium/crypto_core_salsa2012.h deleted file mode 100644 index 05957591ca..0000000000 --- a/win32/include/sodium/crypto_core_salsa2012.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_salsa2012_H -#define crypto_core_salsa2012_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_salsa2012_OUTPUTBYTES 64U -SODIUM_EXPORT -size_t crypto_core_salsa2012_outputbytes(void); - -#define crypto_core_salsa2012_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa2012_inputbytes(void); - -#define crypto_core_salsa2012_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_salsa2012_keybytes(void); - -#define crypto_core_salsa2012_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa2012_constbytes(void); - -SODIUM_EXPORT -int crypto_core_salsa2012(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_core_salsa208.h b/win32/include/sodium/crypto_core_salsa208.h deleted file mode 100644 index d2f216af26..0000000000 --- a/win32/include/sodium/crypto_core_salsa208.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef crypto_core_salsa208_H -#define crypto_core_salsa208_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_salsa208_OUTPUTBYTES 64U -SODIUM_EXPORT -size_t crypto_core_salsa208_outputbytes(void) - __attribute__ ((deprecated)); - -#define crypto_core_salsa208_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa208_inputbytes(void) - __attribute__ ((deprecated)); - -#define crypto_core_salsa208_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_salsa208_keybytes(void) - __attribute__ ((deprecated)); - -#define crypto_core_salsa208_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa208_constbytes(void) - __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_core_salsa208(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_generichash.h b/win32/include/sodium/crypto_generichash.h deleted file mode 100644 index d897e5d26c..0000000000 --- a/win32/include/sodium/crypto_generichash.h +++ /dev/null @@ -1,84 +0,0 @@ -#ifndef crypto_generichash_H -#define crypto_generichash_H - -#include - -#include "crypto_generichash_blake2b.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_generichash_BYTES_MIN crypto_generichash_blake2b_BYTES_MIN -SODIUM_EXPORT -size_t crypto_generichash_bytes_min(void); - -#define crypto_generichash_BYTES_MAX crypto_generichash_blake2b_BYTES_MAX -SODIUM_EXPORT -size_t crypto_generichash_bytes_max(void); - -#define crypto_generichash_BYTES crypto_generichash_blake2b_BYTES -SODIUM_EXPORT -size_t crypto_generichash_bytes(void); - -#define crypto_generichash_KEYBYTES_MIN crypto_generichash_blake2b_KEYBYTES_MIN -SODIUM_EXPORT -size_t crypto_generichash_keybytes_min(void); - -#define crypto_generichash_KEYBYTES_MAX crypto_generichash_blake2b_KEYBYTES_MAX -SODIUM_EXPORT -size_t crypto_generichash_keybytes_max(void); - -#define crypto_generichash_KEYBYTES crypto_generichash_blake2b_KEYBYTES -SODIUM_EXPORT -size_t crypto_generichash_keybytes(void); - -#define crypto_generichash_PRIMITIVE "blake2b" -SODIUM_EXPORT -const char *crypto_generichash_primitive(void); - -/* - * Important when writing bindings for other programming languages: - * the state address should be 64-bytes aligned. - */ -typedef crypto_generichash_blake2b_state crypto_generichash_state; - -SODIUM_EXPORT -size_t crypto_generichash_statebytes(void); - -SODIUM_EXPORT -int crypto_generichash(unsigned char *out, size_t outlen, - const unsigned char *in, unsigned long long inlen, - const unsigned char *key, size_t keylen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_init(crypto_generichash_state *state, - const unsigned char *key, - const size_t keylen, const size_t outlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_update(crypto_generichash_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_final(crypto_generichash_state *state, - unsigned char *out, const size_t outlen) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_generichash_keygen(unsigned char k[crypto_generichash_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_generichash_blake2b.h b/win32/include/sodium/crypto_generichash_blake2b.h deleted file mode 100644 index fee9d8ad19..0000000000 --- a/win32/include/sodium/crypto_generichash_blake2b.h +++ /dev/null @@ -1,118 +0,0 @@ -#ifndef crypto_generichash_blake2b_H -#define crypto_generichash_blake2b_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#if defined(__IBMC__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) -# pragma pack(1) -#else -# pragma pack(push, 1) -#endif - -typedef struct CRYPTO_ALIGN(64) crypto_generichash_blake2b_state { - unsigned char opaque[384]; -} crypto_generichash_blake2b_state; - -#if defined(__IBMC__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) -# pragma pack() -#else -# pragma pack(pop) -#endif - -#define crypto_generichash_blake2b_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_bytes_min(void); - -#define crypto_generichash_blake2b_BYTES_MAX 64U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_bytes_max(void); - -#define crypto_generichash_blake2b_BYTES 32U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_bytes(void); - -#define crypto_generichash_blake2b_KEYBYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_keybytes_min(void); - -#define crypto_generichash_blake2b_KEYBYTES_MAX 64U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_keybytes_max(void); - -#define crypto_generichash_blake2b_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_keybytes(void); - -#define crypto_generichash_blake2b_SALTBYTES 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_saltbytes(void); - -#define crypto_generichash_blake2b_PERSONALBYTES 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_personalbytes(void); - -SODIUM_EXPORT -size_t crypto_generichash_blake2b_statebytes(void); - -SODIUM_EXPORT -int crypto_generichash_blake2b(unsigned char *out, size_t outlen, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *key, size_t keylen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_salt_personal(unsigned char *out, size_t outlen, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *key, - size_t keylen, - const unsigned char *salt, - const unsigned char *personal) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_init(crypto_generichash_blake2b_state *state, - const unsigned char *key, - const size_t keylen, const size_t outlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_init_salt_personal(crypto_generichash_blake2b_state *state, - const unsigned char *key, - const size_t keylen, const size_t outlen, - const unsigned char *salt, - const unsigned char *personal) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_update(crypto_generichash_blake2b_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_final(crypto_generichash_blake2b_state *state, - unsigned char *out, - const size_t outlen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_generichash_blake2b_keygen(unsigned char k[crypto_generichash_blake2b_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_hash.h b/win32/include/sodium/crypto_hash.h deleted file mode 100644 index 8752f9cafe..0000000000 --- a/win32/include/sodium/crypto_hash.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef crypto_hash_H -#define crypto_hash_H - -/* - * WARNING: Unless you absolutely need to use SHA512 for interoperatibility, - * purposes, you might want to consider crypto_generichash() instead. - * Unlike SHA512, crypto_generichash() is not vulnerable to length - * extension attacks. - */ - -#include - -#include "crypto_hash_sha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_hash_BYTES crypto_hash_sha512_BYTES -SODIUM_EXPORT -size_t crypto_hash_bytes(void); - -SODIUM_EXPORT -int crypto_hash(unsigned char *out, const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -#define crypto_hash_PRIMITIVE "sha512" -SODIUM_EXPORT -const char *crypto_hash_primitive(void) - __attribute__ ((warn_unused_result)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_hash_sha256.h b/win32/include/sodium/crypto_hash_sha256.h deleted file mode 100644 index b18217e18d..0000000000 --- a/win32/include/sodium/crypto_hash_sha256.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef crypto_hash_sha256_H -#define crypto_hash_sha256_H - -/* - * WARNING: Unless you absolutely need to use SHA256 for interoperatibility, - * purposes, you might want to consider crypto_generichash() instead. - * Unlike SHA256, crypto_generichash() is not vulnerable to length - * extension attacks. - */ - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct crypto_hash_sha256_state { - uint32_t state[8]; - uint64_t count; - uint8_t buf[64]; -} crypto_hash_sha256_state; - -SODIUM_EXPORT -size_t crypto_hash_sha256_statebytes(void); - -#define crypto_hash_sha256_BYTES 32U -SODIUM_EXPORT -size_t crypto_hash_sha256_bytes(void); - -SODIUM_EXPORT -int crypto_hash_sha256(unsigned char *out, const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha256_init(crypto_hash_sha256_state *state) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_hash_sha256_update(crypto_hash_sha256_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha256_final(crypto_hash_sha256_state *state, - unsigned char *out) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_hash_sha512.h b/win32/include/sodium/crypto_hash_sha512.h deleted file mode 100644 index 8efa7193ad..0000000000 --- a/win32/include/sodium/crypto_hash_sha512.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef crypto_hash_sha512_H -#define crypto_hash_sha512_H - -/* - * WARNING: Unless you absolutely need to use SHA512 for interoperatibility, - * purposes, you might want to consider crypto_generichash() instead. - * Unlike SHA512, crypto_generichash() is not vulnerable to length - * extension attacks. - */ - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct crypto_hash_sha512_state { - uint64_t state[8]; - uint64_t count[2]; - uint8_t buf[128]; -} crypto_hash_sha512_state; - -SODIUM_EXPORT -size_t crypto_hash_sha512_statebytes(void); - -#define crypto_hash_sha512_BYTES 64U -SODIUM_EXPORT -size_t crypto_hash_sha512_bytes(void); - -SODIUM_EXPORT -int crypto_hash_sha512(unsigned char *out, const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha512_init(crypto_hash_sha512_state *state) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_hash_sha512_update(crypto_hash_sha512_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha512_final(crypto_hash_sha512_state *state, - unsigned char *out) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_kdf.h b/win32/include/sodium/crypto_kdf.h deleted file mode 100644 index ac2fc6183c..0000000000 --- a/win32/include/sodium/crypto_kdf.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef crypto_kdf_H -#define crypto_kdf_H - -#include -#include - -#include "crypto_kdf_blake2b.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kdf_BYTES_MIN crypto_kdf_blake2b_BYTES_MIN -SODIUM_EXPORT -size_t crypto_kdf_bytes_min(void); - -#define crypto_kdf_BYTES_MAX crypto_kdf_blake2b_BYTES_MAX -SODIUM_EXPORT -size_t crypto_kdf_bytes_max(void); - -#define crypto_kdf_CONTEXTBYTES crypto_kdf_blake2b_CONTEXTBYTES -SODIUM_EXPORT -size_t crypto_kdf_contextbytes(void); - -#define crypto_kdf_KEYBYTES crypto_kdf_blake2b_KEYBYTES -SODIUM_EXPORT -size_t crypto_kdf_keybytes(void); - -#define crypto_kdf_PRIMITIVE "blake2b" -SODIUM_EXPORT -const char *crypto_kdf_primitive(void) - __attribute__ ((warn_unused_result)); - -SODIUM_EXPORT -int crypto_kdf_derive_from_key(unsigned char *subkey, size_t subkey_len, - uint64_t subkey_id, - const char ctx[crypto_kdf_CONTEXTBYTES], - const unsigned char key[crypto_kdf_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_kdf_keygen(unsigned char k[crypto_kdf_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_kdf_blake2b.h b/win32/include/sodium/crypto_kdf_blake2b.h deleted file mode 100644 index 3ae47dd32c..0000000000 --- a/win32/include/sodium/crypto_kdf_blake2b.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef crypto_kdf_blake2b_H -#define crypto_kdf_blake2b_H - -#include -#include - -#include "crypto_kdf_blake2b.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kdf_blake2b_BYTES_MIN 16 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_bytes_min(void); - -#define crypto_kdf_blake2b_BYTES_MAX 64 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_bytes_max(void); - -#define crypto_kdf_blake2b_CONTEXTBYTES 8 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_contextbytes(void); - -#define crypto_kdf_blake2b_KEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_keybytes(void); - -SODIUM_EXPORT -int crypto_kdf_blake2b_derive_from_key(unsigned char *subkey, size_t subkey_len, - uint64_t subkey_id, - const char ctx[crypto_kdf_blake2b_CONTEXTBYTES], - const unsigned char key[crypto_kdf_blake2b_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_kx.h b/win32/include/sodium/crypto_kx.h deleted file mode 100644 index 347132c320..0000000000 --- a/win32/include/sodium/crypto_kx.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef crypto_kx_H -#define crypto_kx_H - -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kx_PUBLICKEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_publickeybytes(void); - -#define crypto_kx_SECRETKEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_secretkeybytes(void); - -#define crypto_kx_SEEDBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_seedbytes(void); - -#define crypto_kx_SESSIONKEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_sessionkeybytes(void); - -#define crypto_kx_PRIMITIVE "x25519blake2b" -SODIUM_EXPORT -const char *crypto_kx_primitive(void); - -SODIUM_EXPORT -int crypto_kx_seed_keypair(unsigned char pk[crypto_kx_PUBLICKEYBYTES], - unsigned char sk[crypto_kx_SECRETKEYBYTES], - const unsigned char seed[crypto_kx_SEEDBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_kx_keypair(unsigned char pk[crypto_kx_PUBLICKEYBYTES], - unsigned char sk[crypto_kx_SECRETKEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_kx_client_session_keys(unsigned char rx[crypto_kx_SESSIONKEYBYTES], - unsigned char tx[crypto_kx_SESSIONKEYBYTES], - const unsigned char client_pk[crypto_kx_PUBLICKEYBYTES], - const unsigned char client_sk[crypto_kx_SECRETKEYBYTES], - const unsigned char server_pk[crypto_kx_PUBLICKEYBYTES]) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 4, 5))); - -SODIUM_EXPORT -int crypto_kx_server_session_keys(unsigned char rx[crypto_kx_SESSIONKEYBYTES], - unsigned char tx[crypto_kx_SESSIONKEYBYTES], - const unsigned char server_pk[crypto_kx_PUBLICKEYBYTES], - const unsigned char server_sk[crypto_kx_SECRETKEYBYTES], - const unsigned char client_pk[crypto_kx_PUBLICKEYBYTES]) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_onetimeauth.h b/win32/include/sodium/crypto_onetimeauth.h deleted file mode 100644 index 7cd7b07060..0000000000 --- a/win32/include/sodium/crypto_onetimeauth.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef crypto_onetimeauth_H -#define crypto_onetimeauth_H - -#include - -#include "crypto_onetimeauth_poly1305.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef crypto_onetimeauth_poly1305_state crypto_onetimeauth_state; - -SODIUM_EXPORT -size_t crypto_onetimeauth_statebytes(void); - -#define crypto_onetimeauth_BYTES crypto_onetimeauth_poly1305_BYTES -SODIUM_EXPORT -size_t crypto_onetimeauth_bytes(void); - -#define crypto_onetimeauth_KEYBYTES crypto_onetimeauth_poly1305_KEYBYTES -SODIUM_EXPORT -size_t crypto_onetimeauth_keybytes(void); - -#define crypto_onetimeauth_PRIMITIVE "poly1305" -SODIUM_EXPORT -const char *crypto_onetimeauth_primitive(void); - -SODIUM_EXPORT -int crypto_onetimeauth(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_verify(const unsigned char *h, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_init(crypto_onetimeauth_state *state, - const unsigned char *key) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_onetimeauth_update(crypto_onetimeauth_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_onetimeauth_final(crypto_onetimeauth_state *state, - unsigned char *out) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_onetimeauth_keygen(unsigned char k[crypto_onetimeauth_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_onetimeauth_poly1305.h b/win32/include/sodium/crypto_onetimeauth_poly1305.h deleted file mode 100644 index f3e34d86df..0000000000 --- a/win32/include/sodium/crypto_onetimeauth_poly1305.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef crypto_onetimeauth_poly1305_H -#define crypto_onetimeauth_poly1305_H - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#include -#include -#include - -#include - -#include "export.h" - -typedef struct CRYPTO_ALIGN(16) crypto_onetimeauth_poly1305_state { - unsigned char opaque[256]; -} crypto_onetimeauth_poly1305_state; - -SODIUM_EXPORT -size_t crypto_onetimeauth_poly1305_statebytes(void); - -#define crypto_onetimeauth_poly1305_BYTES 16U -SODIUM_EXPORT -size_t crypto_onetimeauth_poly1305_bytes(void); - -#define crypto_onetimeauth_poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_onetimeauth_poly1305_keybytes(void); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_init(crypto_onetimeauth_poly1305_state *state, - const unsigned char *key) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_update(crypto_onetimeauth_poly1305_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_final(crypto_onetimeauth_poly1305_state *state, - unsigned char *out) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_onetimeauth_poly1305_keygen(unsigned char k[crypto_onetimeauth_poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_pwhash.h b/win32/include/sodium/crypto_pwhash.h deleted file mode 100644 index 585a993efd..0000000000 --- a/win32/include/sodium/crypto_pwhash.h +++ /dev/null @@ -1,147 +0,0 @@ -#ifndef crypto_pwhash_H -#define crypto_pwhash_H - -#include - -#include "crypto_pwhash_argon2i.h" -#include "crypto_pwhash_argon2id.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_ALG_ARGON2I13 crypto_pwhash_argon2i_ALG_ARGON2I13 -SODIUM_EXPORT -int crypto_pwhash_alg_argon2i13(void); - -#define crypto_pwhash_ALG_ARGON2ID13 crypto_pwhash_argon2id_ALG_ARGON2ID13 -SODIUM_EXPORT -int crypto_pwhash_alg_argon2id13(void); - -#define crypto_pwhash_ALG_DEFAULT crypto_pwhash_ALG_ARGON2ID13 -SODIUM_EXPORT -int crypto_pwhash_alg_default(void); - -#define crypto_pwhash_BYTES_MIN crypto_pwhash_argon2id_BYTES_MIN -SODIUM_EXPORT -size_t crypto_pwhash_bytes_min(void); - -#define crypto_pwhash_BYTES_MAX crypto_pwhash_argon2id_BYTES_MAX -SODIUM_EXPORT -size_t crypto_pwhash_bytes_max(void); - -#define crypto_pwhash_PASSWD_MIN crypto_pwhash_argon2id_PASSWD_MIN -SODIUM_EXPORT -size_t crypto_pwhash_passwd_min(void); - -#define crypto_pwhash_PASSWD_MAX crypto_pwhash_argon2id_PASSWD_MAX -SODIUM_EXPORT -size_t crypto_pwhash_passwd_max(void); - -#define crypto_pwhash_SALTBYTES crypto_pwhash_argon2id_SALTBYTES -SODIUM_EXPORT -size_t crypto_pwhash_saltbytes(void); - -#define crypto_pwhash_STRBYTES crypto_pwhash_argon2id_STRBYTES -SODIUM_EXPORT -size_t crypto_pwhash_strbytes(void); - -#define crypto_pwhash_STRPREFIX crypto_pwhash_argon2id_STRPREFIX -SODIUM_EXPORT -const char *crypto_pwhash_strprefix(void); - -#define crypto_pwhash_OPSLIMIT_MIN crypto_pwhash_argon2id_OPSLIMIT_MIN -SODIUM_EXPORT -size_t crypto_pwhash_opslimit_min(void); - -#define crypto_pwhash_OPSLIMIT_MAX crypto_pwhash_argon2id_OPSLIMIT_MAX -SODIUM_EXPORT -size_t crypto_pwhash_opslimit_max(void); - -#define crypto_pwhash_MEMLIMIT_MIN crypto_pwhash_argon2id_MEMLIMIT_MIN -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_min(void); - -#define crypto_pwhash_MEMLIMIT_MAX crypto_pwhash_argon2id_MEMLIMIT_MAX -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_max(void); - -#define crypto_pwhash_OPSLIMIT_INTERACTIVE crypto_pwhash_argon2id_OPSLIMIT_INTERACTIVE -SODIUM_EXPORT -size_t crypto_pwhash_opslimit_interactive(void); - -#define crypto_pwhash_MEMLIMIT_INTERACTIVE crypto_pwhash_argon2id_MEMLIMIT_INTERACTIVE -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_interactive(void); - -#define crypto_pwhash_OPSLIMIT_MODERATE crypto_pwhash_argon2id_OPSLIMIT_MODERATE -SODIUM_EXPORT -size_t crypto_pwhash_opslimit_moderate(void); - -#define crypto_pwhash_MEMLIMIT_MODERATE crypto_pwhash_argon2id_MEMLIMIT_MODERATE -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_moderate(void); - -#define crypto_pwhash_OPSLIMIT_SENSITIVE crypto_pwhash_argon2id_OPSLIMIT_SENSITIVE -SODIUM_EXPORT -size_t crypto_pwhash_opslimit_sensitive(void); - -#define crypto_pwhash_MEMLIMIT_SENSITIVE crypto_pwhash_argon2id_MEMLIMIT_SENSITIVE -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_sensitive(void); - -/* - * With this function, do not forget to store all parameters, including the - * algorithm identifier in order to produce deterministic output. - * The crypto_pwhash_* definitions, including crypto_pwhash_ALG_DEFAULT, - * may change. - */ -SODIUM_EXPORT -int crypto_pwhash(unsigned char * const out, unsigned long long outlen, - const char * const passwd, unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, size_t memlimit, int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -/* - * The output string already includes all the required parameters, including - * the algorithm identifier. The string is all that has to be stored in - * order to verify a password. - */ -SODIUM_EXPORT -int crypto_pwhash_str(char out[crypto_pwhash_STRBYTES], - const char * const passwd, unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_str_alg(char out[crypto_pwhash_STRBYTES], - const char * const passwd, unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit, int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_str_verify(const char str[crypto_pwhash_STRBYTES], - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_str_needs_rehash(const char str[crypto_pwhash_STRBYTES], - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#define crypto_pwhash_PRIMITIVE "argon2i" -SODIUM_EXPORT -const char *crypto_pwhash_primitive(void) - __attribute__ ((warn_unused_result)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_pwhash_argon2i.h b/win32/include/sodium/crypto_pwhash_argon2i.h deleted file mode 100644 index 88ff6221d6..0000000000 --- a/win32/include/sodium/crypto_pwhash_argon2i.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef crypto_pwhash_argon2i_H -#define crypto_pwhash_argon2i_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_argon2i_ALG_ARGON2I13 1 -SODIUM_EXPORT -int crypto_pwhash_argon2i_alg_argon2i13(void); - -#define crypto_pwhash_argon2i_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_bytes_min(void); - -#define crypto_pwhash_argon2i_BYTES_MAX SODIUM_MIN(SODIUM_SIZE_MAX, 4294967295U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_bytes_max(void); - -#define crypto_pwhash_argon2i_PASSWD_MIN 0U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_passwd_min(void); - -#define crypto_pwhash_argon2i_PASSWD_MAX 4294967295U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_passwd_max(void); - -#define crypto_pwhash_argon2i_SALTBYTES 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_saltbytes(void); - -#define crypto_pwhash_argon2i_STRBYTES 128U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_strbytes(void); - -#define crypto_pwhash_argon2i_STRPREFIX "$argon2i$" -SODIUM_EXPORT -const char *crypto_pwhash_argon2i_strprefix(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_MIN 3U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_opslimit_min(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_MAX 4294967295U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_opslimit_max(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_MIN 8192U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_min(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_MAX \ - ((SIZE_MAX >= 4398046510080U) ? 4398046510080U : (SIZE_MAX >= 2147483648U) ? 2147483648U : 32768U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_max(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_INTERACTIVE 4U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_opslimit_interactive(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_INTERACTIVE 33554432U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_interactive(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_MODERATE 6U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_opslimit_moderate(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_MODERATE 134217728U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_moderate(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_SENSITIVE 8U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_opslimit_sensitive(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_SENSITIVE 536870912U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_sensitive(void); - -SODIUM_EXPORT -int crypto_pwhash_argon2i(unsigned char * const out, - unsigned long long outlen, - const char * const passwd, - unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, size_t memlimit, - int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2i_str(char out[crypto_pwhash_argon2i_STRBYTES], - const char * const passwd, - unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2i_str_verify(const char str[crypto_pwhash_argon2i_STRBYTES], - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2i_str_needs_rehash(const char str[crypto_pwhash_argon2i_STRBYTES], - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_pwhash_argon2id.h b/win32/include/sodium/crypto_pwhash_argon2id.h deleted file mode 100644 index 7183abd186..0000000000 --- a/win32/include/sodium/crypto_pwhash_argon2id.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef crypto_pwhash_argon2id_H -#define crypto_pwhash_argon2id_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_argon2id_ALG_ARGON2ID13 2 -SODIUM_EXPORT -int crypto_pwhash_argon2id_alg_argon2id13(void); - -#define crypto_pwhash_argon2id_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_bytes_min(void); - -#define crypto_pwhash_argon2id_BYTES_MAX SODIUM_MIN(SODIUM_SIZE_MAX, 4294967295U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_bytes_max(void); - -#define crypto_pwhash_argon2id_PASSWD_MIN 0U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_passwd_min(void); - -#define crypto_pwhash_argon2id_PASSWD_MAX 4294967295U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_passwd_max(void); - -#define crypto_pwhash_argon2id_SALTBYTES 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_saltbytes(void); - -#define crypto_pwhash_argon2id_STRBYTES 128U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_strbytes(void); - -#define crypto_pwhash_argon2id_STRPREFIX "$argon2id$" -SODIUM_EXPORT -const char *crypto_pwhash_argon2id_strprefix(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_MIN 1U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_opslimit_min(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_MAX 4294967295U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_opslimit_max(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_MIN 8192U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_min(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_MAX \ - ((SIZE_MAX >= 4398046510080U) ? 4398046510080U : (SIZE_MAX >= 2147483648U) ? 2147483648U : 32768U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_max(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_INTERACTIVE 2U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_opslimit_interactive(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_INTERACTIVE 67108864U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_interactive(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_MODERATE 3U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_opslimit_moderate(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_MODERATE 268435456U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_moderate(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_SENSITIVE 4U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_opslimit_sensitive(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_SENSITIVE 1073741824U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_sensitive(void); - -SODIUM_EXPORT -int crypto_pwhash_argon2id(unsigned char * const out, - unsigned long long outlen, - const char * const passwd, - unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, size_t memlimit, - int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2id_str(char out[crypto_pwhash_argon2id_STRBYTES], - const char * const passwd, - unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2id_str_verify(const char str[crypto_pwhash_argon2id_STRBYTES], - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2id_str_needs_rehash(const char str[crypto_pwhash_argon2id_STRBYTES], - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_pwhash_scryptsalsa208sha256.h b/win32/include/sodium/crypto_pwhash_scryptsalsa208sha256.h deleted file mode 100644 index 5c0bf7d390..0000000000 --- a/win32/include/sodium/crypto_pwhash_scryptsalsa208sha256.h +++ /dev/null @@ -1,120 +0,0 @@ -#ifndef crypto_pwhash_scryptsalsa208sha256_H -#define crypto_pwhash_scryptsalsa208sha256_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_scryptsalsa208sha256_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_bytes_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_BYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX, 0x1fffffffe0ULL) -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_bytes_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_PASSWD_MIN 0U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_passwd_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_PASSWD_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_passwd_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_SALTBYTES 32U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_saltbytes(void); - -#define crypto_pwhash_scryptsalsa208sha256_STRBYTES 102U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_strbytes(void); - -#define crypto_pwhash_scryptsalsa208sha256_STRPREFIX "$7$" -SODIUM_EXPORT -const char *crypto_pwhash_scryptsalsa208sha256_strprefix(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_MIN 32768U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_opslimit_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_MAX 4294967295U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_opslimit_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_MIN 16777216U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_MAX \ - SODIUM_MIN(SIZE_MAX, 68719476736ULL) -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE 524288U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_opslimit_interactive(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE 16777216U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_interactive(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_SENSITIVE 33554432U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_SENSITIVE 1073741824U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive(void); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256(unsigned char * const out, - unsigned long long outlen, - const char * const passwd, - unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, - size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_str(char out[crypto_pwhash_scryptsalsa208sha256_STRBYTES], - const char * const passwd, - unsigned long long passwdlen, - unsigned long long opslimit, - size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_str_verify(const char str[crypto_pwhash_scryptsalsa208sha256_STRBYTES], - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_ll(const uint8_t * passwd, size_t passwdlen, - const uint8_t * salt, size_t saltlen, - uint64_t N, uint32_t r, uint32_t p, - uint8_t * buf, size_t buflen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_str_needs_rehash(const char str[crypto_pwhash_scryptsalsa208sha256_STRBYTES], - unsigned long long opslimit, - size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_scalarmult.h b/win32/include/sodium/crypto_scalarmult.h deleted file mode 100644 index 1c68585378..0000000000 --- a/win32/include/sodium/crypto_scalarmult.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef crypto_scalarmult_H -#define crypto_scalarmult_H - -#include - -#include "crypto_scalarmult_curve25519.h" -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_BYTES crypto_scalarmult_curve25519_BYTES -SODIUM_EXPORT -size_t crypto_scalarmult_bytes(void); - -#define crypto_scalarmult_SCALARBYTES crypto_scalarmult_curve25519_SCALARBYTES -SODIUM_EXPORT -size_t crypto_scalarmult_scalarbytes(void); - -#define crypto_scalarmult_PRIMITIVE "curve25519" -SODIUM_EXPORT -const char *crypto_scalarmult_primitive(void); - -SODIUM_EXPORT -int crypto_scalarmult_base(unsigned char *q, const unsigned char *n) - __attribute__ ((nonnull)); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_scalarmult_curve25519.h b/win32/include/sodium/crypto_scalarmult_curve25519.h deleted file mode 100644 index 60e9d0c5a4..0000000000 --- a/win32/include/sodium/crypto_scalarmult_curve25519.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef crypto_scalarmult_curve25519_H -#define crypto_scalarmult_curve25519_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_curve25519_BYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_curve25519_bytes(void); - -#define crypto_scalarmult_curve25519_SCALARBYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_curve25519_scalarbytes(void); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult_curve25519(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_curve25519_base(unsigned char *q, - const unsigned char *n) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_scalarmult_ed25519.h b/win32/include/sodium/crypto_scalarmult_ed25519.h deleted file mode 100644 index 2dfa4d7073..0000000000 --- a/win32/include/sodium/crypto_scalarmult_ed25519.h +++ /dev/null @@ -1,51 +0,0 @@ - -#ifndef crypto_scalarmult_ed25519_H -#define crypto_scalarmult_ed25519_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_ed25519_BYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ed25519_bytes(void); - -#define crypto_scalarmult_ed25519_SCALARBYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ed25519_scalarbytes(void); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult_ed25519(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ed25519_noclamp(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ed25519_base(unsigned char *q, const unsigned char *n) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ed25519_base_noclamp(unsigned char *q, const unsigned char *n) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_scalarmult_ristretto255.h b/win32/include/sodium/crypto_scalarmult_ristretto255.h deleted file mode 100644 index 40a45ccef0..0000000000 --- a/win32/include/sodium/crypto_scalarmult_ristretto255.h +++ /dev/null @@ -1,43 +0,0 @@ - -#ifndef crypto_scalarmult_ristretto255_H -#define crypto_scalarmult_ristretto255_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_ristretto255_BYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ristretto255_bytes(void); - -#define crypto_scalarmult_ristretto255_SCALARBYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ristretto255_scalarbytes(void); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult_ristretto255(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ristretto255_base(unsigned char *q, - const unsigned char *n) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_secretbox.h b/win32/include/sodium/crypto_secretbox.h deleted file mode 100644 index 1d3709db12..0000000000 --- a/win32/include/sodium/crypto_secretbox.h +++ /dev/null @@ -1,93 +0,0 @@ -#ifndef crypto_secretbox_H -#define crypto_secretbox_H - -#include - -#include "crypto_secretbox_xsalsa20poly1305.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretbox_KEYBYTES crypto_secretbox_xsalsa20poly1305_KEYBYTES -SODIUM_EXPORT -size_t crypto_secretbox_keybytes(void); - -#define crypto_secretbox_NONCEBYTES crypto_secretbox_xsalsa20poly1305_NONCEBYTES -SODIUM_EXPORT -size_t crypto_secretbox_noncebytes(void); - -#define crypto_secretbox_MACBYTES crypto_secretbox_xsalsa20poly1305_MACBYTES -SODIUM_EXPORT -size_t crypto_secretbox_macbytes(void); - -#define crypto_secretbox_PRIMITIVE "xsalsa20poly1305" -SODIUM_EXPORT -const char *crypto_secretbox_primitive(void); - -#define crypto_secretbox_MESSAGEBYTES_MAX crypto_secretbox_xsalsa20poly1305_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_secretbox_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_secretbox_easy(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_open_easy(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_detached(unsigned char *c, unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_secretbox_open_detached(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -SODIUM_EXPORT -void crypto_secretbox_keygen(unsigned char k[crypto_secretbox_KEYBYTES]) - __attribute__ ((nonnull)); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_secretbox_ZEROBYTES crypto_secretbox_xsalsa20poly1305_ZEROBYTES -SODIUM_EXPORT -size_t crypto_secretbox_zerobytes(void); - -#define crypto_secretbox_BOXZEROBYTES crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES -SODIUM_EXPORT -size_t crypto_secretbox_boxzerobytes(void); - -SODIUM_EXPORT -int crypto_secretbox(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_open(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_secretbox_xchacha20poly1305.h b/win32/include/sodium/crypto_secretbox_xchacha20poly1305.h deleted file mode 100644 index 6ec674e310..0000000000 --- a/win32/include/sodium/crypto_secretbox_xchacha20poly1305.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef crypto_secretbox_xchacha20poly1305_H -#define crypto_secretbox_xchacha20poly1305_H - -#include -#include "crypto_stream_xchacha20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretbox_xchacha20poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_keybytes(void); - -#define crypto_secretbox_xchacha20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_noncebytes(void); - -#define crypto_secretbox_xchacha20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_macbytes(void); - -#define crypto_secretbox_xchacha20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xchacha20_MESSAGEBYTES_MAX - crypto_secretbox_xchacha20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_easy(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_open_easy(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_detached(unsigned char *c, - unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_open_detached(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_secretbox_xsalsa20poly1305.h b/win32/include/sodium/crypto_secretbox_xsalsa20poly1305.h deleted file mode 100644 index be0874cbaf..0000000000 --- a/win32/include/sodium/crypto_secretbox_xsalsa20poly1305.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef crypto_secretbox_xsalsa20poly1305_H -#define crypto_secretbox_xsalsa20poly1305_H - -#include -#include "crypto_stream_xsalsa20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretbox_xsalsa20poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_keybytes(void); - -#define crypto_secretbox_xsalsa20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_noncebytes(void); - -#define crypto_secretbox_xsalsa20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_macbytes(void); - -/* Only for the libsodium API - The NaCl compatibility API would require BOXZEROBYTES extra bytes */ -#define crypto_secretbox_xsalsa20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xsalsa20_MESSAGEBYTES_MAX - crypto_secretbox_xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_secretbox_xsalsa20poly1305(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_xsalsa20poly1305_open(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -void crypto_secretbox_xsalsa20poly1305_keygen(unsigned char k[crypto_secretbox_xsalsa20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES 16U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_boxzerobytes(void); - -#define crypto_secretbox_xsalsa20poly1305_ZEROBYTES \ - (crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES + \ - crypto_secretbox_xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_zerobytes(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_secretstream_xchacha20poly1305.h b/win32/include/sodium/crypto_secretstream_xchacha20poly1305.h deleted file mode 100644 index b22e4e9313..0000000000 --- a/win32/include/sodium/crypto_secretstream_xchacha20poly1305.h +++ /dev/null @@ -1,108 +0,0 @@ -#ifndef crypto_secretstream_xchacha20poly1305_H -#define crypto_secretstream_xchacha20poly1305_H - -#include - -#include "crypto_aead_xchacha20poly1305.h" -#include "crypto_stream_chacha20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretstream_xchacha20poly1305_ABYTES \ - (1U + crypto_aead_xchacha20poly1305_ietf_ABYTES) -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_abytes(void); - -#define crypto_secretstream_xchacha20poly1305_HEADERBYTES \ - crypto_aead_xchacha20poly1305_ietf_NPUBBYTES -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_headerbytes(void); - -#define crypto_secretstream_xchacha20poly1305_KEYBYTES \ - crypto_aead_xchacha20poly1305_ietf_KEYBYTES -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_keybytes(void); - -#define crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_secretstream_xchacha20poly1305_ABYTES, \ - (64ULL * ((1ULL << 32) - 2ULL))) -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_messagebytes_max(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_MESSAGE 0x00 -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_message(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_PUSH 0x01 -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_push(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_REKEY 0x02 -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_rekey(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_FINAL \ - (crypto_secretstream_xchacha20poly1305_TAG_PUSH | \ - crypto_secretstream_xchacha20poly1305_TAG_REKEY) -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_final(void); - -typedef struct crypto_secretstream_xchacha20poly1305_state { - unsigned char k[crypto_stream_chacha20_ietf_KEYBYTES]; - unsigned char nonce[crypto_stream_chacha20_ietf_NONCEBYTES]; - unsigned char _pad[8]; -} crypto_secretstream_xchacha20poly1305_state; - -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_statebytes(void); - -SODIUM_EXPORT -void crypto_secretstream_xchacha20poly1305_keygen - (unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_init_push - (crypto_secretstream_xchacha20poly1305_state *state, - unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES], - const unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_push - (crypto_secretstream_xchacha20poly1305_state *state, - unsigned char *c, unsigned long long *clen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *ad, unsigned long long adlen, unsigned char tag) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_init_pull - (crypto_secretstream_xchacha20poly1305_state *state, - const unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES], - const unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_pull - (crypto_secretstream_xchacha20poly1305_state *state, - unsigned char *m, unsigned long long *mlen_p, unsigned char *tag_p, - const unsigned char *c, unsigned long long clen, - const unsigned char *ad, unsigned long long adlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -void crypto_secretstream_xchacha20poly1305_rekey - (crypto_secretstream_xchacha20poly1305_state *state); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_shorthash.h b/win32/include/sodium/crypto_shorthash.h deleted file mode 100644 index fecaa88bd8..0000000000 --- a/win32/include/sodium/crypto_shorthash.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef crypto_shorthash_H -#define crypto_shorthash_H - -#include - -#include "crypto_shorthash_siphash24.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_shorthash_BYTES crypto_shorthash_siphash24_BYTES -SODIUM_EXPORT -size_t crypto_shorthash_bytes(void); - -#define crypto_shorthash_KEYBYTES crypto_shorthash_siphash24_KEYBYTES -SODIUM_EXPORT -size_t crypto_shorthash_keybytes(void); - -#define crypto_shorthash_PRIMITIVE "siphash24" -SODIUM_EXPORT -const char *crypto_shorthash_primitive(void); - -SODIUM_EXPORT -int crypto_shorthash(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -void crypto_shorthash_keygen(unsigned char k[crypto_shorthash_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_shorthash_siphash24.h b/win32/include/sodium/crypto_shorthash_siphash24.h deleted file mode 100644 index 1e6f72a620..0000000000 --- a/win32/include/sodium/crypto_shorthash_siphash24.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef crypto_shorthash_siphash24_H -#define crypto_shorthash_siphash24_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -/* -- 64-bit output -- */ - -#define crypto_shorthash_siphash24_BYTES 8U -SODIUM_EXPORT -size_t crypto_shorthash_siphash24_bytes(void); - -#define crypto_shorthash_siphash24_KEYBYTES 16U -SODIUM_EXPORT -size_t crypto_shorthash_siphash24_keybytes(void); - -SODIUM_EXPORT -int crypto_shorthash_siphash24(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -#ifndef SODIUM_LIBRARY_MINIMAL -/* -- 128-bit output -- */ - -#define crypto_shorthash_siphashx24_BYTES 16U -SODIUM_EXPORT -size_t crypto_shorthash_siphashx24_bytes(void); - -#define crypto_shorthash_siphashx24_KEYBYTES 16U -SODIUM_EXPORT -size_t crypto_shorthash_siphashx24_keybytes(void); - -SODIUM_EXPORT -int crypto_shorthash_siphashx24(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_sign.h b/win32/include/sodium/crypto_sign.h deleted file mode 100644 index f5fafb123e..0000000000 --- a/win32/include/sodium/crypto_sign.h +++ /dev/null @@ -1,107 +0,0 @@ -#ifndef crypto_sign_H -#define crypto_sign_H - -/* - * THREAD SAFETY: crypto_sign_keypair() is thread-safe, - * provided that sodium_init() was called before. - * - * Other functions, including crypto_sign_seed_keypair() are always thread-safe. - */ - -#include - -#include "crypto_sign_ed25519.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef crypto_sign_ed25519ph_state crypto_sign_state; - -SODIUM_EXPORT -size_t crypto_sign_statebytes(void); - -#define crypto_sign_BYTES crypto_sign_ed25519_BYTES -SODIUM_EXPORT -size_t crypto_sign_bytes(void); - -#define crypto_sign_SEEDBYTES crypto_sign_ed25519_SEEDBYTES -SODIUM_EXPORT -size_t crypto_sign_seedbytes(void); - -#define crypto_sign_PUBLICKEYBYTES crypto_sign_ed25519_PUBLICKEYBYTES -SODIUM_EXPORT -size_t crypto_sign_publickeybytes(void); - -#define crypto_sign_SECRETKEYBYTES crypto_sign_ed25519_SECRETKEYBYTES -SODIUM_EXPORT -size_t crypto_sign_secretkeybytes(void); - -#define crypto_sign_MESSAGEBYTES_MAX crypto_sign_ed25519_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_sign_messagebytes_max(void); - -#define crypto_sign_PRIMITIVE "ed25519" -SODIUM_EXPORT -const char *crypto_sign_primitive(void); - -SODIUM_EXPORT -int crypto_sign_seed_keypair(unsigned char *pk, unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_keypair(unsigned char *pk, unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign(unsigned char *sm, unsigned long long *smlen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_open(unsigned char *m, unsigned long long *mlen_p, - const unsigned char *sm, unsigned long long smlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5))); - -SODIUM_EXPORT -int crypto_sign_detached(unsigned char *sig, unsigned long long *siglen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_verify_detached(const unsigned char *sig, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_sign_init(crypto_sign_state *state); - -SODIUM_EXPORT -int crypto_sign_update(crypto_sign_state *state, - const unsigned char *m, unsigned long long mlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_sign_final_create(crypto_sign_state *state, unsigned char *sig, - unsigned long long *siglen_p, - const unsigned char *sk) - __attribute__ ((nonnull(1, 2, 4))); - -SODIUM_EXPORT -int crypto_sign_final_verify(crypto_sign_state *state, const unsigned char *sig, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_sign_ed25519.h b/win32/include/sodium/crypto_sign_ed25519.h deleted file mode 100644 index 0fdac42d35..0000000000 --- a/win32/include/sodium/crypto_sign_ed25519.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef crypto_sign_ed25519_H -#define crypto_sign_ed25519_H - -#include -#include "crypto_hash_sha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct crypto_sign_ed25519ph_state { - crypto_hash_sha512_state hs; -} crypto_sign_ed25519ph_state; - -SODIUM_EXPORT -size_t crypto_sign_ed25519ph_statebytes(void); - -#define crypto_sign_ed25519_BYTES 64U -SODIUM_EXPORT -size_t crypto_sign_ed25519_bytes(void); - -#define crypto_sign_ed25519_SEEDBYTES 32U -SODIUM_EXPORT -size_t crypto_sign_ed25519_seedbytes(void); - -#define crypto_sign_ed25519_PUBLICKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_sign_ed25519_publickeybytes(void); - -#define crypto_sign_ed25519_SECRETKEYBYTES (32U + 32U) -SODIUM_EXPORT -size_t crypto_sign_ed25519_secretkeybytes(void); - -#define crypto_sign_ed25519_MESSAGEBYTES_MAX (SODIUM_SIZE_MAX - crypto_sign_ed25519_BYTES) -SODIUM_EXPORT -size_t crypto_sign_ed25519_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_sign_ed25519(unsigned char *sm, unsigned long long *smlen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) - __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_ed25519_open(unsigned char *m, unsigned long long *mlen_p, - const unsigned char *sm, unsigned long long smlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5))); - -SODIUM_EXPORT -int crypto_sign_ed25519_detached(unsigned char *sig, - unsigned long long *siglen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *sk) - __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_ed25519_verify_detached(const unsigned char *sig, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_sign_ed25519_keypair(unsigned char *pk, unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_seed_keypair(unsigned char *pk, unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_pk_to_curve25519(unsigned char *curve25519_pk, - const unsigned char *ed25519_pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_sk_to_curve25519(unsigned char *curve25519_sk, - const unsigned char *ed25519_sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_sk_to_seed(unsigned char *seed, - const unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_sk_to_pk(unsigned char *pk, const unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_init(crypto_sign_ed25519ph_state *state) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_update(crypto_sign_ed25519ph_state *state, - const unsigned char *m, - unsigned long long mlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_final_create(crypto_sign_ed25519ph_state *state, - unsigned char *sig, - unsigned long long *siglen_p, - const unsigned char *sk) - __attribute__ ((nonnull(1, 2, 4))); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_final_verify(crypto_sign_ed25519ph_state *state, - const unsigned char *sig, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_sign_edwards25519sha512batch.h b/win32/include/sodium/crypto_sign_edwards25519sha512batch.h deleted file mode 100644 index eed158aa84..0000000000 --- a/win32/include/sodium/crypto_sign_edwards25519sha512batch.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef crypto_sign_edwards25519sha512batch_H -#define crypto_sign_edwards25519sha512batch_H - -/* - * WARNING: This construction was a prototype, which should not be used - * any more in new projects. - * - * crypto_sign_edwards25519sha512batch is provided for applications - * initially built with NaCl, but as recommended by the author of this - * construction, new applications should use ed25519 instead. - * - * In Sodium, you should use the high-level crypto_sign_*() functions instead. - */ - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_sign_edwards25519sha512batch_BYTES 64U -#define crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES 32U -#define crypto_sign_edwards25519sha512batch_SECRETKEYBYTES (32U + 32U) -#define crypto_sign_edwards25519sha512batch_MESSAGEBYTES_MAX (SODIUM_SIZE_MAX - crypto_sign_edwards25519sha512batch_BYTES) - -SODIUM_EXPORT -int crypto_sign_edwards25519sha512batch(unsigned char *sm, - unsigned long long *smlen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *sk) - __attribute__ ((deprecated)) __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_edwards25519sha512batch_open(unsigned char *m, - unsigned long long *mlen_p, - const unsigned char *sm, - unsigned long long smlen, - const unsigned char *pk) - __attribute__ ((deprecated)) __attribute__ ((nonnull(3, 5))); - -SODIUM_EXPORT -int crypto_sign_edwards25519sha512batch_keypair(unsigned char *pk, - unsigned char *sk) - __attribute__ ((deprecated)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_stream.h b/win32/include/sodium/crypto_stream.h deleted file mode 100644 index 88dab5f611..0000000000 --- a/win32/include/sodium/crypto_stream.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef crypto_stream_H -#define crypto_stream_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include - -#include "crypto_stream_xsalsa20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_KEYBYTES crypto_stream_xsalsa20_KEYBYTES -SODIUM_EXPORT -size_t crypto_stream_keybytes(void); - -#define crypto_stream_NONCEBYTES crypto_stream_xsalsa20_NONCEBYTES -SODIUM_EXPORT -size_t crypto_stream_noncebytes(void); - -#define crypto_stream_MESSAGEBYTES_MAX crypto_stream_xsalsa20_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_stream_messagebytes_max(void); - -#define crypto_stream_PRIMITIVE "xsalsa20" -SODIUM_EXPORT -const char *crypto_stream_primitive(void); - -SODIUM_EXPORT -int crypto_stream(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_keygen(unsigned char k[crypto_stream_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_stream_chacha20.h b/win32/include/sodium/crypto_stream_chacha20.h deleted file mode 100644 index 408897558b..0000000000 --- a/win32/include/sodium/crypto_stream_chacha20.h +++ /dev/null @@ -1,106 +0,0 @@ -#ifndef crypto_stream_chacha20_H -#define crypto_stream_chacha20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_chacha20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_chacha20_keybytes(void); - -#define crypto_stream_chacha20_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_chacha20_noncebytes(void); - -#define crypto_stream_chacha20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_chacha20_messagebytes_max(void); - -/* ChaCha20 with a 64-bit nonce and a 64-bit counter, as originally designed */ - -SODIUM_EXPORT -int crypto_stream_chacha20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_chacha20_keygen(unsigned char k[crypto_stream_chacha20_KEYBYTES]) - __attribute__ ((nonnull)); - -/* ChaCha20 with a 96-bit nonce and a 32-bit counter (IETF) */ - -#define crypto_stream_chacha20_ietf_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_chacha20_ietf_keybytes(void); - -#define crypto_stream_chacha20_ietf_NONCEBYTES 12U -SODIUM_EXPORT -size_t crypto_stream_chacha20_ietf_noncebytes(void); - -#define crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX, 64ULL * (1ULL << 32)) -SODIUM_EXPORT -size_t crypto_stream_chacha20_ietf_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_chacha20_ietf(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_ietf_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_ietf_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint32_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_chacha20_ietf_keygen(unsigned char k[crypto_stream_chacha20_ietf_KEYBYTES]) - __attribute__ ((nonnull)); - -/* Aliases */ - -#define crypto_stream_chacha20_IETF_KEYBYTES crypto_stream_chacha20_ietf_KEYBYTES -#define crypto_stream_chacha20_IETF_NONCEBYTES crypto_stream_chacha20_ietf_NONCEBYTES -#define crypto_stream_chacha20_IETF_MESSAGEBYTES_MAX crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_stream_salsa20.h b/win32/include/sodium/crypto_stream_salsa20.h deleted file mode 100644 index 45b3b3e34a..0000000000 --- a/win32/include/sodium/crypto_stream_salsa20.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef crypto_stream_salsa20_H -#define crypto_stream_salsa20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_salsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_salsa20_keybytes(void); - -#define crypto_stream_salsa20_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_salsa20_noncebytes(void); - -#define crypto_stream_salsa20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_salsa20_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_salsa20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_salsa20_keygen(unsigned char k[crypto_stream_salsa20_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_stream_salsa2012.h b/win32/include/sodium/crypto_stream_salsa2012.h deleted file mode 100644 index 6c5d303cac..0000000000 --- a/win32/include/sodium/crypto_stream_salsa2012.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef crypto_stream_salsa2012_H -#define crypto_stream_salsa2012_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_salsa2012_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_salsa2012_keybytes(void); - -#define crypto_stream_salsa2012_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_salsa2012_noncebytes(void); - -#define crypto_stream_salsa2012_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_salsa2012_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_salsa2012(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa2012_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_salsa2012_keygen(unsigned char k[crypto_stream_salsa2012_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_stream_salsa208.h b/win32/include/sodium/crypto_stream_salsa208.h deleted file mode 100644 index d574f30478..0000000000 --- a/win32/include/sodium/crypto_stream_salsa208.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef crypto_stream_salsa208_H -#define crypto_stream_salsa208_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_salsa208_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_salsa208_keybytes(void) - __attribute__ ((deprecated)); - -#define crypto_stream_salsa208_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_salsa208_noncebytes(void) - __attribute__ ((deprecated)); - -#define crypto_stream_salsa208_MESSAGEBYTES_MAX SODIUM_SIZE_MAX - SODIUM_EXPORT -size_t crypto_stream_salsa208_messagebytes_max(void) - __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_stream_salsa208(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa208_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_salsa208_keygen(unsigned char k[crypto_stream_salsa208_KEYBYTES]) - __attribute__ ((deprecated)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_stream_xchacha20.h b/win32/include/sodium/crypto_stream_xchacha20.h deleted file mode 100644 index c4002db00a..0000000000 --- a/win32/include/sodium/crypto_stream_xchacha20.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef crypto_stream_xchacha20_H -#define crypto_stream_xchacha20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_xchacha20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_xchacha20_keybytes(void); - -#define crypto_stream_xchacha20_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_stream_xchacha20_noncebytes(void); - -#define crypto_stream_xchacha20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_xchacha20_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_xchacha20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xchacha20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xchacha20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_xchacha20_keygen(unsigned char k[crypto_stream_xchacha20_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_stream_xsalsa20.h b/win32/include/sodium/crypto_stream_xsalsa20.h deleted file mode 100644 index 20034e3462..0000000000 --- a/win32/include/sodium/crypto_stream_xsalsa20.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef crypto_stream_xsalsa20_H -#define crypto_stream_xsalsa20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_xsalsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_xsalsa20_keybytes(void); - -#define crypto_stream_xsalsa20_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_stream_xsalsa20_noncebytes(void); - -#define crypto_stream_xsalsa20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_xsalsa20_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_xsalsa20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xsalsa20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xsalsa20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_xsalsa20_keygen(unsigned char k[crypto_stream_xsalsa20_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_verify_16.h b/win32/include/sodium/crypto_verify_16.h deleted file mode 100644 index 7b9c8077ad..0000000000 --- a/win32/include/sodium/crypto_verify_16.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_verify_16_H -#define crypto_verify_16_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_verify_16_BYTES 16U -SODIUM_EXPORT -size_t crypto_verify_16_bytes(void); - -SODIUM_EXPORT -int crypto_verify_16(const unsigned char *x, const unsigned char *y) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_verify_32.h b/win32/include/sodium/crypto_verify_32.h deleted file mode 100644 index 9b0f4529f6..0000000000 --- a/win32/include/sodium/crypto_verify_32.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_verify_32_H -#define crypto_verify_32_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_verify_32_BYTES 32U -SODIUM_EXPORT -size_t crypto_verify_32_bytes(void); - -SODIUM_EXPORT -int crypto_verify_32(const unsigned char *x, const unsigned char *y) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/crypto_verify_64.h b/win32/include/sodium/crypto_verify_64.h deleted file mode 100644 index c83b73025a..0000000000 --- a/win32/include/sodium/crypto_verify_64.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_verify_64_H -#define crypto_verify_64_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_verify_64_BYTES 64U -SODIUM_EXPORT -size_t crypto_verify_64_bytes(void); - -SODIUM_EXPORT -int crypto_verify_64(const unsigned char *x, const unsigned char *y) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/export.h b/win32/include/sodium/export.h deleted file mode 100644 index a0074fc9cb..0000000000 --- a/win32/include/sodium/export.h +++ /dev/null @@ -1,57 +0,0 @@ - -#ifndef sodium_export_H -#define sodium_export_H - -#include -#include -#include - -#if !defined(__clang__) && !defined(__GNUC__) -# ifdef __attribute__ -# undef __attribute__ -# endif -# define __attribute__(a) -#endif - -#ifdef SODIUM_STATIC -# define SODIUM_EXPORT -# define SODIUM_EXPORT_WEAK -#else -# if defined(_MSC_VER) -# ifdef SODIUM_DLL_EXPORT -# define SODIUM_EXPORT __declspec(dllexport) -# else -# define SODIUM_EXPORT __declspec(dllimport) -# endif -# else -# if defined(__SUNPRO_C) -# ifndef __GNU_C__ -# define SODIUM_EXPORT __attribute__ (visibility(__global)) -# else -# define SODIUM_EXPORT __attribute__ __global -# endif -# elif defined(_MSG_VER) -# define SODIUM_EXPORT extern __declspec(dllexport) -# else -# define SODIUM_EXPORT __attribute__ ((visibility ("default"))) -# endif -# endif -# if defined(__ELF__) && !defined(SODIUM_DISABLE_WEAK_FUNCTIONS) -# define SODIUM_EXPORT_WEAK SODIUM_EXPORT __attribute__((weak)) -# else -# define SODIUM_EXPORT_WEAK SODIUM_EXPORT -# endif -#endif - -#ifndef CRYPTO_ALIGN -# if defined(__INTEL_COMPILER) || defined(_MSC_VER) -# define CRYPTO_ALIGN(x) __declspec(align(x)) -# else -# define CRYPTO_ALIGN(x) __attribute__ ((aligned(x))) -# endif -#endif - -#define SODIUM_MIN(A, B) ((A) < (B) ? (A) : (B)) -#define SODIUM_SIZE_MAX SODIUM_MIN(UINT64_MAX, SIZE_MAX) - -#endif diff --git a/win32/include/sodium/randombytes.h b/win32/include/sodium/randombytes.h deleted file mode 100644 index a03cc65720..0000000000 --- a/win32/include/sodium/randombytes.h +++ /dev/null @@ -1,72 +0,0 @@ - -#ifndef randombytes_H -#define randombytes_H - -#include -#include - -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct randombytes_implementation { - const char *(*implementation_name)(void); /* required */ - uint32_t (*random)(void); /* required */ - void (*stir)(void); /* optional */ - uint32_t (*uniform)(const uint32_t upper_bound); /* optional, a default implementation will be used if NULL */ - void (*buf)(void * const buf, const size_t size); /* required */ - int (*close)(void); /* optional */ -} randombytes_implementation; - -#define randombytes_BYTES_MAX SODIUM_MIN(SODIUM_SIZE_MAX, 0xffffffffUL) - -#define randombytes_SEEDBYTES 32U -SODIUM_EXPORT -size_t randombytes_seedbytes(void); - -SODIUM_EXPORT -void randombytes_buf(void * const buf, const size_t size) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void randombytes_buf_deterministic(void * const buf, const size_t size, - const unsigned char seed[randombytes_SEEDBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -uint32_t randombytes_random(void); - -SODIUM_EXPORT -uint32_t randombytes_uniform(const uint32_t upper_bound); - -SODIUM_EXPORT -void randombytes_stir(void); - -SODIUM_EXPORT -int randombytes_close(void); - -SODIUM_EXPORT -int randombytes_set_implementation(randombytes_implementation *impl) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -const char *randombytes_implementation_name(void); - -/* -- NaCl compatibility interface -- */ - -SODIUM_EXPORT -void randombytes(unsigned char * const buf, const unsigned long long buf_len) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/randombytes_internal_random.h b/win32/include/sodium/randombytes_internal_random.h deleted file mode 100644 index 2b2b7d6edc..0000000000 --- a/win32/include/sodium/randombytes_internal_random.h +++ /dev/null @@ -1,22 +0,0 @@ - -#ifndef randombytes_internal_random_H -#define randombytes_internal_random_H - -#include "export.h" -#include "randombytes.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -extern struct randombytes_implementation randombytes_internal_implementation; - -/* Backwards compatibility with libsodium < 1.0.18 */ -#define randombytes_salsa20_implementation randombytes_internal_implementation - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/randombytes_sysrandom.h b/win32/include/sodium/randombytes_sysrandom.h deleted file mode 100644 index 9e27b674c7..0000000000 --- a/win32/include/sodium/randombytes_sysrandom.h +++ /dev/null @@ -1,19 +0,0 @@ - -#ifndef randombytes_sysrandom_H -#define randombytes_sysrandom_H - -#include "export.h" -#include "randombytes.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -extern struct randombytes_implementation randombytes_sysrandom_implementation; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/runtime.h b/win32/include/sodium/runtime.h deleted file mode 100644 index 7f15d58e7c..0000000000 --- a/win32/include/sodium/runtime.h +++ /dev/null @@ -1,52 +0,0 @@ - -#ifndef sodium_runtime_H -#define sodium_runtime_H - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_neon(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_sse2(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_sse3(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_ssse3(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_sse41(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_avx(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_avx2(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_avx512f(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_pclmul(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_aesni(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_rdrand(void); - -/* ------------------------------------------------------------------------- */ - -int _sodium_runtime_get_cpu_features(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/utils.h b/win32/include/sodium/utils.h deleted file mode 100644 index ac80151291..0000000000 --- a/win32/include/sodium/utils.h +++ /dev/null @@ -1,179 +0,0 @@ - -#ifndef sodium_utils_H -#define sodium_utils_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef SODIUM_C99 -# if defined(__cplusplus) || !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L -# define SODIUM_C99(X) -# else -# define SODIUM_C99(X) X -# endif -#endif - -SODIUM_EXPORT -void sodium_memzero(void * const pnt, const size_t len); - -SODIUM_EXPORT -void sodium_stackzero(const size_t len); - -/* - * WARNING: sodium_memcmp() must be used to verify if two secret keys - * are equal, in constant time. - * It returns 0 if the keys are equal, and -1 if they differ. - * This function is not designed for lexicographical comparisons. - */ -SODIUM_EXPORT -int sodium_memcmp(const void * const b1_, const void * const b2_, size_t len) - __attribute__ ((warn_unused_result)); - -/* - * sodium_compare() returns -1 if b1_ < b2_, 1 if b1_ > b2_ and 0 if b1_ == b2_ - * It is suitable for lexicographical comparisons, or to compare nonces - * and counters stored in little-endian format. - * However, it is slower than sodium_memcmp(). - */ -SODIUM_EXPORT -int sodium_compare(const unsigned char *b1_, const unsigned char *b2_, - size_t len) __attribute__ ((warn_unused_result)); - -SODIUM_EXPORT -int sodium_is_zero(const unsigned char *n, const size_t nlen); - -SODIUM_EXPORT -void sodium_increment(unsigned char *n, const size_t nlen); - -SODIUM_EXPORT -void sodium_add(unsigned char *a, const unsigned char *b, const size_t len); - -SODIUM_EXPORT -void sodium_sub(unsigned char *a, const unsigned char *b, const size_t len); - -SODIUM_EXPORT -char *sodium_bin2hex(char * const hex, const size_t hex_maxlen, - const unsigned char * const bin, const size_t bin_len) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int sodium_hex2bin(unsigned char * const bin, const size_t bin_maxlen, - const char * const hex, const size_t hex_len, - const char * const ignore, size_t * const bin_len, - const char ** const hex_end) - __attribute__ ((nonnull(1))); - -#define sodium_base64_VARIANT_ORIGINAL 1 -#define sodium_base64_VARIANT_ORIGINAL_NO_PADDING 3 -#define sodium_base64_VARIANT_URLSAFE 5 -#define sodium_base64_VARIANT_URLSAFE_NO_PADDING 7 - -/* - * Computes the required length to encode BIN_LEN bytes as a base64 string - * using the given variant. The computed length includes a trailing \0. - */ -#define sodium_base64_ENCODED_LEN(BIN_LEN, VARIANT) \ - (((BIN_LEN) / 3U) * 4U + \ - ((((BIN_LEN) - ((BIN_LEN) / 3U) * 3U) | (((BIN_LEN) - ((BIN_LEN) / 3U) * 3U) >> 1)) & 1U) * \ - (4U - (~((((VARIANT) & 2U) >> 1) - 1U) & (3U - ((BIN_LEN) - ((BIN_LEN) / 3U) * 3U)))) + 1U) - -SODIUM_EXPORT -size_t sodium_base64_encoded_len(const size_t bin_len, const int variant); - -SODIUM_EXPORT -char *sodium_bin2base64(char * const b64, const size_t b64_maxlen, - const unsigned char * const bin, const size_t bin_len, - const int variant) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int sodium_base642bin(unsigned char * const bin, const size_t bin_maxlen, - const char * const b64, const size_t b64_len, - const char * const ignore, size_t * const bin_len, - const char ** const b64_end, const int variant) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int sodium_mlock(void * const addr, const size_t len) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_munlock(void * const addr, const size_t len) - __attribute__ ((nonnull)); - -/* WARNING: sodium_malloc() and sodium_allocarray() are not general-purpose - * allocation functions. - * - * They return a pointer to a region filled with 0xd0 bytes, immediately - * followed by a guard page. - * As a result, accessing a single byte after the requested allocation size - * will intentionally trigger a segmentation fault. - * - * A canary and an additional guard page placed before the beginning of the - * region may also kill the process if a buffer underflow is detected. - * - * The memory layout is: - * [unprotected region size (read only)][guard page (no access)][unprotected pages (read/write)][guard page (no access)] - * With the layout of the unprotected pages being: - * [optional padding][16-bytes canary][user region] - * - * However: - * - These functions are significantly slower than standard functions - * - Each allocation requires 3 or 4 additional pages - * - The returned address will not be aligned if the allocation size is not - * a multiple of the required alignment. For this reason, these functions - * are designed to store data, such as secret keys and messages. - * - * sodium_malloc() can be used to allocate any libsodium data structure. - * - * The crypto_generichash_state structure is packed and its length is - * either 357 or 361 bytes. For this reason, when using sodium_malloc() to - * allocate a crypto_generichash_state structure, padding must be added in - * order to ensure proper alignment. crypto_generichash_statebytes() - * returns the rounded up structure size, and should be prefered to sizeof(): - * state = sodium_malloc(crypto_generichash_statebytes()); - */ - -SODIUM_EXPORT -void *sodium_malloc(const size_t size) - __attribute__ ((malloc)); - -SODIUM_EXPORT -void *sodium_allocarray(size_t count, size_t size) - __attribute__ ((malloc)); - -SODIUM_EXPORT -void sodium_free(void *ptr); - -SODIUM_EXPORT -int sodium_mprotect_noaccess(void *ptr) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_mprotect_readonly(void *ptr) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_mprotect_readwrite(void *ptr) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_pad(size_t *padded_buflen_p, unsigned char *buf, - size_t unpadded_buflen, size_t blocksize, size_t max_buflen) - __attribute__ ((nonnull(2))); - -SODIUM_EXPORT -int sodium_unpad(size_t *unpadded_buflen_p, const unsigned char *buf, - size_t padded_buflen, size_t blocksize) - __attribute__ ((nonnull(2))); - -/* -------- */ - -int _sodium_alloc_init(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/win32/include/sodium/version.h b/win32/include/sodium/version.h deleted file mode 100644 index 201a290e7d..0000000000 --- a/win32/include/sodium/version.h +++ /dev/null @@ -1,33 +0,0 @@ - -#ifndef sodium_version_H -#define sodium_version_H - -#include "export.h" - -#define SODIUM_VERSION_STRING "1.0.18" - -#define SODIUM_LIBRARY_VERSION_MAJOR 10 -#define SODIUM_LIBRARY_VERSION_MINOR 3 - - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -const char *sodium_version_string(void); - -SODIUM_EXPORT -int sodium_library_version_major(void); - -SODIUM_EXPORT -int sodium_library_version_minor(void); - -SODIUM_EXPORT -int sodium_library_minimal(void); - -#ifdef __cplusplus -} -#endif - -#endif From 5110945ae8a263b9956c40efad4c9eb23c63fdc2 Mon Sep 17 00:00:00 2001 From: "Craig Edwards (Brain)" Date: Fri, 11 Oct 2024 10:07:01 +0100 Subject: [PATCH 15/19] refactor: remove unused debug variable (#1266) --- src/dpp/voice/enabled/opus.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/dpp/voice/enabled/opus.cpp b/src/dpp/voice/enabled/opus.cpp index 9f8aaeaff9..5eb7a77cc4 100644 --- a/src/dpp/voice/enabled/opus.cpp +++ b/src/dpp/voice/enabled/opus.cpp @@ -117,7 +117,6 @@ discord_voice_client& discord_voice_client::send_audio_opus(uint8_t* opus_packet size_t packet_siz = sizeof(header) + (encoded_audio_length + ssl_crypto_aead_xchacha20poly1305_IETF_ABYTES) + sizeof(packet_nonce); std::vector payload(packet_siz); - std::vector payload2(packet_siz); /* Set RTP header */ std::memcpy(payload.data(), &header, sizeof(header)); From 6134d8da41179b8d2e0a4276570705d05e3e38b2 Mon Sep 17 00:00:00 2001 From: Miuna <809711+Mishura4@users.noreply.github.com> Date: Fri, 11 Oct 2024 14:28:42 -0400 Subject: [PATCH 16/19] docs: prevent "The Windows 7 Incident" (#1267) --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index f0a658892a..953da47cb6 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,8 @@ You can find more examples in our [example page](https://dpp.dev/example-program ## 💻 Supported Systems +We support the following OS families, as long as they are still officially supported by their provider. **We will provide no support for operating systems past end-of-life**. + ### Linux The library runs ideally on **Linux**. From a1a32d227a49d92e637d3311468cc53508e6e446 Mon Sep 17 00:00:00 2001 From: "Craig Edwards (Brain)" Date: Sat, 12 Oct 2024 13:37:27 +0100 Subject: [PATCH 17/19] fix: crash in threads_get_public_archived (#1268) --- src/dpp/thread.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/dpp/thread.cpp b/src/dpp/thread.cpp index 8cfe5d618a..af661fe663 100644 --- a/src/dpp/thread.cpp +++ b/src/dpp/thread.cpp @@ -46,12 +46,14 @@ thread& thread::fill_from_json_impl(json* j) { set_int8_not_null(j, "member_count", this->member_count); set_bool_not_null(j, "newly_created", this->newly_created); - auto json_metadata = (*j)["thread_metadata"]; - metadata.archived = bool_not_null(&json_metadata, "archived"); - metadata.archive_timestamp = ts_not_null(&json_metadata, "archive_timestamp"); - metadata.auto_archive_duration = int16_not_null(&json_metadata, "auto_archive_duration"); - metadata.locked = bool_not_null(&json_metadata, "locked"); - metadata.invitable = bool_not_null(&json_metadata, "invitable"); + if (j->contains("thread_metadata")) { + auto json_metadata = (*j)["thread_metadata"]; + metadata.archived = bool_not_null(&json_metadata, "archived"); + metadata.archive_timestamp = ts_not_null(&json_metadata, "archive_timestamp"); + metadata.auto_archive_duration = int16_not_null(&json_metadata, "auto_archive_duration"); + metadata.locked = bool_not_null(&json_metadata, "locked"); + metadata.invitable = bool_not_null(&json_metadata, "invitable"); + } /* Only certain events set this */ if (j->contains("member")) { From 7940773c3e6a846f24c80841096040c9bc4d3cbf Mon Sep 17 00:00:00 2001 From: "Craig Edwards (Brain)" Date: Sun, 13 Oct 2024 12:20:43 +0100 Subject: [PATCH 18/19] fix: vcpkg is always built with voice (#1272) --- library-vcpkg/CMakeLists.txt | 37 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/library-vcpkg/CMakeLists.txt b/library-vcpkg/CMakeLists.txt index 3148b6163d..16df61f4f5 100644 --- a/library-vcpkg/CMakeLists.txt +++ b/library-vcpkg/CMakeLists.txt @@ -18,12 +18,7 @@ add_compile_definitions(HAVE_VOICE) -if (HAVE_VOICE) - file(GLOB THE_SOURCES "${DPP_ROOT_PATH}/src/dpp/events/*.cpp" "${modules_dir}/dpp/voice/enabled/*.cpp" "${DPP_ROOT_PATH}/dpp/dave/*.cpp" "${DPP_ROOT_PATH}/src/dpp/cluster/*.cpp" "${DPP_ROOT_PATH}/src/dpp/*.cpp" "${DPP_ROOT_PATH}/src/dpp/*.rc") -else() - file(GLOB THE_SOURCES "${DPP_ROOT_PATH}/src/dpp/events/*.cpp" "${modules_dir}/dpp/voice/stub/*.cpp" "${DPP_ROOT_PATH}/src/dpp/cluster/*.cpp" "${DPP_ROOT_PATH}/src/dpp/*.cpp" "${DPP_ROOT_PATH}/src/dpp/*.rc") -endif() - +file(GLOB THE_SOURCES "${DPP_ROOT_PATH}/src/dpp/events/*.cpp" "${modules_dir}/dpp/voice/enabled/*.cpp" "${DPP_ROOT_PATH}/dpp/dave/*.cpp" "${DPP_ROOT_PATH}/src/dpp/cluster/*.cpp" "${DPP_ROOT_PATH}/src/dpp/*.cpp" "${DPP_ROOT_PATH}/src/dpp/*.rc") set(LIB_NAME "${PROJECT_NAME}") @@ -87,12 +82,10 @@ target_include_directories( "$" ) -if (HAVE_VOICE) - add_subdirectory("${DPP_ROOT_PATH}/mlspp" "mlspp") - include_directories("${DPP_ROOT_PATH}/mlspp/include") - include_directories("${DPP_ROOT_PATH}/mlspp/lib/bytes/include") - include_directories("${DPP_ROOT_PATH}/mlspp/lib/hpke/include") -endif() +add_subdirectory("${DPP_ROOT_PATH}/mlspp" "mlspp") +include_directories("${DPP_ROOT_PATH}/mlspp/include") +include_directories("${DPP_ROOT_PATH}/mlspp/lib/bytes/include") +include_directories("${DPP_ROOT_PATH}/mlspp/lib/hpke/include") set_target_properties( "${LIB_NAME}" PROPERTIES @@ -120,17 +113,15 @@ target_link_libraries( $<$:Threads::Threads> ) -if (HAVE_VOICE) - # Private statically linked dependencies - target_link_libraries( - ${LIB_NAME} PRIVATE - mlspp - mls_vectors - bytes - tls_syntax - hpke - ) -endif() +# Private statically linked dependencies +target_link_libraries( + ${LIB_NAME} PRIVATE + mlspp + mls_vectors + bytes + tls_syntax + hpke +) set(CONFIG_FILE_NAME "${PROJECT_NAME}Config.cmake") set(EXPORTED_TARGETS_NAME "${PROJECT_NAME}Targets") From 6ba5df850f2b57363a18bee9b85da555fc3341dc Mon Sep 17 00:00:00 2001 From: Craig Edwards Date: Sun, 13 Oct 2024 19:52:42 +0000 Subject: [PATCH 19/19] [skip ci] version bump --- include/dpp/version.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/dpp/version.h b/include/dpp/version.h index d047704e86..e94dc4af7b 100644 --- a/include/dpp/version.h +++ b/include/dpp/version.h @@ -21,10 +21,10 @@ ************************************************************************************/ #pragma once -#if !defined(DPP_VERSION_LONG) -#define DPP_VERSION_LONG 0x00100032 -#define DPP_VERSION_SHORT 100032 -#define DPP_VERSION_TEXT "D++ 10.0.32 (22-Sep-2024)" +#ifndef DPP_VERSION_LONG +#define DPP_VERSION_LONG 0x00100033 +#define DPP_VERSION_SHORT 100033 +#define DPP_VERSION_TEXT "D++ 10.0.33 (13-Oct-2024)" #define DPP_VERSION_MAJOR ((DPP_VERSION_LONG & 0x00ff0000) >> 16) #define DPP_VERSION_MINOR ((DPP_VERSION_LONG & 0x0000ff00) >> 8)