PyFlow
PyFlow is a high-level network protocol with APIs for transferring messages, files, and folders, plus extensible interfaces etc..
Features
- TCP server / client — message exchange, custom commands, file transfer, and port allocation over a single control channel (
PyFlow/network_api/connect_tcp.py). - UDP communication — connectionless messaging (
PyFlow/network_api/connect_udp.py). - Encrypted TCP channel — RSA-OAEP message encryption with a TOFU (trust-on-first-use) peer-key registry, session nonces and sequence numbers against replay, and a circuit breaker against re-exchange storms. See docs/Crypto and the encrypted-channel sections of the TCP API docs.
- C/OpenSSL cryptography library —
libcrypto_apiprovides RSA-OAEP, ECDH (P-256/384/521), HKDF-SHA256 and AES-256-GCM with a stable C API (pf_*prefix) usable from C, CMake or pkg-config. - Multi-instance launcher —
python -m PyFlow(package entry point backed byPyFlow/flow_setup.py) starts one or more server/client instances from a CLI, an interactive prompt, or asetup.jsonconfiguration file. - Extension protocols —
command_control_extension_tcp.py(remote command execution with log collection) andforward_extension_tcp.py(forwarding messages/files/folders to multiple destinations) plug into any instance viasetup_*_commands();flow_setup.pyloads them automatically for every instance whosesetup.jsonconfig setsis_extend_command=True, and starts instances in a background thread whenis_input_command_in_console=False.
Architecture
PyFlow/
├── crypto_api/ C/OpenSSL library (pf_crypto, pf_rsa, pf_ecdh)
│ └── include/ public headers: pf_crypto.h, pf_rsa.h, pf_ecdh.h
├── network_api/
│ ├── connect_tcp.py TCP_Server_Base / TCP_Client_Base
│ ├── connect_udp.py UDP communication
│ ├── rsa_crypto.py ctypes binding to libcrypto_api + TOFU key registry
│ └── decode_command_table.json wire-format table for the file-transfer protocol
├── command_control_extension_tcp.py command-control extension over TCP
├── forward_extension_tcp.py forward extension over TCP (messages/files/folders to multiple destinations)
├── __init__.py / __main__.py package launcher entry (`python -m PyFlow`)
├── flow_setup.py launcher implementation
└── setup.json default launcher configuration (generated)
test/ C tests (test_hkdf/test_rsa/test_ecdh) + Python tests
docs/ Sphinx documentation (multi-language)
CMakeLists.txt top-level build for the C library and C tests
The Python layer runs on the standard library only; the C library is loaded at runtime via ctypes.
Requirements
- Python 3.10 or newer
- Pip 25.1 or newer
- CMake 3.16 or newer
- OpenSSL 1.1.1 or newer (development headers, e.g.
libssl-devon Debian/Ubuntu) - A C compiler (gcc/clang on Linux/macOS, MSVC on Windows)
Build
1. Build the C library (required for the encrypted channel)
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --parallel
ctest --test-dir build --output-on-failure # optional: run the C test suite
This produces build/libcrypto_api.so (or .dylib / .dll), which rsa_crypto.py locates automatically.
2. Set up the Python environment
With uv (the project uses pyproject.toml + uv.lock):
uv sync --group dev
Or with pip:
python -m venv .venv
# Windows:
.venv\Scripts\activate
# Linux/macOS:
source .venv/bin/activate
pip install --group dev -e .
Quick start
The examples below use uv run for uv users; if you installed with pip instead, drop the uv run prefix and use python -m directly.
Interactive launcher
uv run python -m PyFlow
Prompts for server/client configuration, writes setup.json, and launches the instances.
Command-line launcher
Start a server listening on 127.0.0.1:12345:
uv run python -m PyFlow --type 0 --setup_addr_port 127.0.0.1:12345
Start a client that connects to that server (and binds its own local address/port):
uv run python -m PyFlow --type 1 --setup_addr_port 127.0.0.1:23456 --connect_addr_port 127.0.0.1:12345
setup.json
A pre-written setup.json is honoured by the launcher:
{
"servers": [
{ "host": "127.0.0.1", "port": 12345, "max_clients": 10,
"is_extend_command": false, "is_input_command_in_console": true }
],
"clients": []
}
Programmatic use
from PyFlow.network_api.connect_tcp import TCP_Server_Base, TCP_Client_Base
server = TCP_Server_Base(host="127.0.0.1", port=12345, is_extend_command=True)
client = TCP_Client_Base(host="127.0.0.1", port=12345, is_extend_command=True)
By default both ends enable the encrypted channel (is_enable_encrypto=True): keys come from ~/.ssh/id_rsa when parseable, otherwise an RSA-2048 pair is generated into PyFlow/network_api/.Flow/pvt_key/, and peer keys are exchanged and TOFU-checked on every connection (PyFlow/network_api/.Flow/pub_key/pub_key.json). See the TCP API docs for is_custom_keys and the full handshake.
Testing
uv run pytest # full Python suite
ctest --test-dir build # C library tests
The encrypted-channel tests (test/test_crypto_rsa.py, test/test_crypto_tcp.py) are skipped automatically when libcrypto_api has not been built; everything else runs regardless. The suite passes on Python 3.10–3.14, including the free-threaded (no-GIL) 3.14 build.
Documentation
Sphinx sources live in docs/ (English source with ja/ko/ru/zh_CN/zh_TW translations). Build the HTML docs with:
uv run python -m sphinx -b html docs build/sphinx_doc
Rebuild the translations (extract gettext, machine-translate new strings, compile .mo) with docs/reBuild.sh; it needs the documentation/translation dependencies from pyproject.toml (sphinx, sphinx-intl, polib, deep-translator).
License
Metadata
Release files for pyflow-net 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pyflow_net-0.5.0.tar.gz | 96.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyflow_net-0.5.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 166.1 kB
Release files / pyflow_net-0.5.0.tar.gz
| Download URL | pyflow_net-0.5.0.tar.gz |
|---|---|
| Size | 96.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
63e913c30740070230b33242bb545f52013e82ce6b04f93e02cccd646f77fe03
|
|
BLAKE2b-256 checksum How to use checksums |
abfb58a8ebeeed40346ee4ce3b332347300c6b52b15777893601526581736726
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / pyflow_net-0.5.0-py3-none-any.whl
| Download URL | pyflow_net-0.5.0-py3-none-any.whl |
|---|---|
| Size | 69.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
930686d4fa912bbc259ad4dee5e811cdee80d765432bba5ef2a3b7d3ba6b0e44
|
|
BLAKE2b-256 checksum How to use checksums |
d427c443b397b0daa557f5970d13b7745626c5cec450d52d30bbde50a67c4c30
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|