Add `ss-local --printable-salt` / `"printable_salt": true`, disabled by
default. For each outgoing TCP salt it picks a prefix length uniformly
from 6-12 bytes and samples those bytes as printable ASCII (0x20-0x7e)
immediately before key derivation. The salt stays 32 bytes with no
framing or markers, so the wire format is unchanged and any stock
server interoperates. Only chacha20-ietf-poly1305 and aes-256-gcm are
accepted; other ciphers fail at startup. UDP, server responses, and
AEAD-2022 are untouched.
Crypto unit tests cover length distribution, empty first writes, exact
framing overhead, salt-tail preservation, byte-at-a-time decryption,
tampering and replay rejection. CLI tests check local-only exposure and
cipher rejection via flag, config key and bad config type. interop.py
gains --printable-salt and --server-bin for independent stock servers.
docs/printable-salt.md records the design, entropy bound, fingerprint
caveats and route-experiment procedure; docs/encoding-experiments.md
and tests/experiments/ hold the Base85/lowpop85/TLS outer-transport
prototypes. docs/measurements/printable-salt-2026-09-23/ archives the
sanitized results of the aborted field trials.
Co-authored-by: Claude <noreply@anthropic.com>
Bundle pinned offline dependencies, remove libcork/libipset and submodule requirements, and add portable runtime helpers with relocatable static/shared library installations.
Add Clang static build validation for Linux/musl, macOS and Windows, real TCP/UDP and SIP003 interoperability coverage, and recorded performance tradeoffs. All 21 hosted checks pass at the reviewed PR head 8d504e6218.
Real bugs fixed:
- manager.c: kill_server/stop_server checked fscanf() != EOF, so malformed
pid file content left pid uninitialized and passed it to kill(). Parse
with fgets + ss_parse_int and require pid > 0.
- utils.c: get_default_conf() crashed on strlen(NULL) when HOME is unset
(e.g. daemons started by init) and left a dangling static pointer after
free(), a latent use-after-free on repeated calls. Use a static buffer
and fall back to the system config when HOME is missing.
- local.c: in UDP_ONLY mode, start_ss_local_server() passed uninitialized
listen_ctx.fd to the library callback. Initialize it to -1.
Improvements:
- Replace rand()/srand(time(NULL)) upstream-server selection in ss-local,
ss-redir and ss-tunnel with libsodium randombytes_uniform(): unbiased,
unpredictable, and no seeding required (cert-msc30/msc32).
- Mark FATAL() noreturn so both the compiler and analyzers understand
control flow (removes a family of analyzer false positives).
- Drop two dead stores (manager.c restore_sigchld, udprelay.c src_addr_len).
All remaining findings were verified as false positives and carry NOLINT
comments with rationale (uthash macro internals, symmetric back-pointer
cleanup, analyzer-invisible postconditions). clang-tidy-18 on Linux now
reports zero warnings, so MAX_WARNINGS drops from 29 to 0.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* format with .uncrustify.cfg
format with .uncrustify.cfg
* format with .uncrustify.cfg
* format with .uncrustify.cfg exclude json.* base64.* uthash.h
* format with .uncrustify.cfg exclude json.* base64.* uthash.h
Sometimes we need processes to run in the foreground to be supervised
and at the same time use syslog facility instead of logging its stdout,
stderr output
* Add Ping-Pong bloom filter
* Refine bloom filter insertion
* Reduce the error rate to 0.00001
* Avoid alignment issue in murmurhash2
* Fix a memory leak
* Fix build on non-GPU targets
* Detect get_current_dir_name in configure
* Update README.md
* Remove redudant bfree()
* Reduce the memory usage for local client
* Fix#1275
* Refine #1275
* Use IP when bypassing SNI domains
* Also apply replay detector on UDP traffic
* Update deb build script
Now build script is able to auto detect system and choose libraries
necessary to build.
Also update the README accordingly.
* Update build script to enable jessie/stretch etc
Also include a few cleanup that simplified pkg installation from
backports repository.
Add experimental HTTP/TLS obfuscating as an **optional extension** of shadowsocks protocol.
More discussions can be found here: https://github.com/shadowsocks/shadowsocks-org/issues/26
As this feature is still a SIP (Shadowsocks Improvement Proposal), it's very unstable and experimental. So,
1. Don't enable it unless you know what it is.
2. Be very careful when using it in production environment.
* Add 'tunnel_address' support for json config parser
And allow ss-tunnel to use the newly introduced parser.
Signed-off-by: Adam Anonymous <anonymous_temp_user@yahoo.co.jp>
* Add "mode" support for jconf
Now jconf supports "mode" setting, allowed values are "tcp_only",
"tcp_and_udp" and "udp_only".
Signed-off-by: Adam Anonymous <anonymous_temp_mail@yahoo.co.jp>
* Use jconf "mode" for server/local/tunnel/manager
Signed-off-by: Adam Anonymous <anonymous_temp_mail@yahoo.co.jp>
* Add per-project vimrc to gitignore
As the coding style differs from kernel and other projects, so such
project vimrc should be helpful.
Signed-off-by: Adam Anonymous <anonymous_temp_mail@yahoo.co.jp>