mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-21 22:43:48 +00:00
* Add allocation-free C++ AEAD codecs src/crypto/aead.hpp implements the SIP004/SIP007 AEAD ciphers as value types: AeadEngine holds the libsodium or Mbed TLS GCM state by value, AeadTcpEncryptor/AeadTcpDecryptor frame the chunk stream with a fixed reassembly buffer, and aead_udp_seal/open handle packets. HKDF-SHA1 runs on stack SHA-1 state instead of Mbed TLS's allocating HMAC API. The bundled Mbed TLS config now enables MBEDTLS_BLOCK_CIPHER_C, which keeps the AES context inside mbedtls_gcm_context, so GCM key setup no longer allocates. That alone saves the C programs two allocations per connection. test_crypto_aead_cpp checks HKDF against RFC 5869 and crypto_hkdf, runs TCP streams and UDP packets between the C and C++ implementations in both directions for all five AEAD methods, and covers tampering, framing and salt replay. alloc_steady_crypto_aead runs it under the malloc counter and requires zero allocations across 600 new connections and 600 packets (tests/alloc_audit/check_steady.py). ss_strict_warnings() now applies -Wextra per source file so targets mixing new C++ with converted C modules keep the latter at -Wall, and Result gains move assignment. * Include <algorithm> for std::min in test_crypto_aead_cpp.cpp * Build the C++ AEAD codecs against Mbed TLS 2.x Mbed TLS 2 returns void from mbedtls_sha1_starts/update/finish (the int versions are the _ret variants), which the system-library build on Ubuntu (2.28) rejects. crypto/mbedtls_compat.hpp gives one int-returning spelling for both. * Include C++ headers before crypto.h in test_crypto_aead_cpp.cpp crypto.h defines min/max macros for the C sources; libstdc++ headers included after it fail to parse. * Disable the zero-allocation checks with a system Mbed TLS They hold for the bundled Mbed TLS (MBEDTLS_BLOCK_CIPHER_C); a system one may allocate in GCM key setup, as the Debian package build shows.
34 lines
740 B
C++
34 lines
740 B
C++
/* SPDX-License-Identifier: GPL-3.0-or-later */
|
|
#ifndef SS_ALLOC_PROBE_HPP
|
|
#define SS_ALLOC_PROBE_HPP
|
|
|
|
// Mark points in a test program for tests/alloc_audit/check_steady.py.
|
|
//
|
|
// When the alloc_counter shim is preloaded (it sets SS_ALLOC_AUDIT_OUT and
|
|
// handles SIGUSR2), each mark appends the running allocation count to the
|
|
// audit file. Without the shim the marks do nothing, so the same test binary
|
|
// also runs normally.
|
|
|
|
#include <csignal>
|
|
#include <cstdlib>
|
|
|
|
namespace ss::test {
|
|
|
|
inline bool alloc_audit_enabled()
|
|
{
|
|
return std::getenv("SS_ALLOC_AUDIT_OUT") != nullptr;
|
|
}
|
|
|
|
inline void alloc_mark()
|
|
{
|
|
#ifdef SIGUSR2
|
|
if (alloc_audit_enabled()) {
|
|
std::raise(SIGUSR2);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
} // namespace ss::test
|
|
|
|
#endif
|